mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-05 00:40:00 +00:00
Linux may not care, but Darwin will barf if we don't actually
align the stack on the code we generate. Fix some existing code to do what the comments claim it already does, and then actually use that code. :) git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1650 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
0ed845f3d4
commit
84711122ee
@ -103,6 +103,7 @@ void XEmitter::ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2
|
|||||||
}
|
}
|
||||||
|
|
||||||
void XEmitter::ABI_PushAllCalleeSavedRegsAndAdjustStack() {
|
void XEmitter::ABI_PushAllCalleeSavedRegsAndAdjustStack() {
|
||||||
|
ABI_AlignStack(0);
|
||||||
// Note: 4 * 4 = 16 bytes, so alignment is preserved.
|
// Note: 4 * 4 = 16 bytes, so alignment is preserved.
|
||||||
PUSH(EBP);
|
PUSH(EBP);
|
||||||
PUSH(EBX);
|
PUSH(EBX);
|
||||||
@ -115,6 +116,7 @@ void XEmitter::ABI_PopAllCalleeSavedRegsAndAdjustStack() {
|
|||||||
POP(ESI);
|
POP(ESI);
|
||||||
POP(EBX);
|
POP(EBX);
|
||||||
POP(EBP);
|
POP(EBP);
|
||||||
|
ABI_RestoreStack(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int XEmitter::ABI_GetAlignedFrameSize(unsigned int frameSize) {
|
unsigned int XEmitter::ABI_GetAlignedFrameSize(unsigned int frameSize) {
|
||||||
|
@ -67,13 +67,8 @@ AsmRoutineManager asm_routines;
|
|||||||
void AsmRoutineManager::Generate()
|
void AsmRoutineManager::Generate()
|
||||||
{
|
{
|
||||||
enterCode = AlignCode16();
|
enterCode = AlignCode16();
|
||||||
#ifdef _M_IX86
|
|
||||||
PUSH(EBP);
|
|
||||||
PUSH(EBX);
|
|
||||||
PUSH(ESI);
|
|
||||||
PUSH(EDI);
|
|
||||||
#else
|
|
||||||
ABI_PushAllCalleeSavedRegsAndAdjustStack();
|
ABI_PushAllCalleeSavedRegsAndAdjustStack();
|
||||||
|
#ifndef _M_IX86
|
||||||
// Two statically allocated registers.
|
// Two statically allocated registers.
|
||||||
MOV(64, R(RBX), Imm64((u64)Memory::base));
|
MOV(64, R(RBX), Imm64((u64)Memory::base));
|
||||||
MOV(64, R(R15), Imm64((u64)jit.GetBlockCache()->GetCodePointers())); //It's below 2GB so 32 bits are good enough
|
MOV(64, R(R15), Imm64((u64)jit.GetBlockCache()->GetCodePointers())); //It's below 2GB so 32 bits are good enough
|
||||||
@ -162,27 +157,13 @@ void AsmRoutineManager::Generate()
|
|||||||
TEST(32, M((void*)&PowerPC::state), Imm32(0xFFFFFFFF));
|
TEST(32, M((void*)&PowerPC::state), Imm32(0xFFFFFFFF));
|
||||||
J_CC(CC_Z, outerLoop, true);
|
J_CC(CC_Z, outerLoop, true);
|
||||||
|
|
||||||
#ifdef _M_IX86
|
|
||||||
POP(EDI);
|
|
||||||
POP(ESI);
|
|
||||||
POP(EBX);
|
|
||||||
POP(EBP);
|
|
||||||
#else
|
|
||||||
//Landing pad for drec space
|
//Landing pad for drec space
|
||||||
ABI_PopAllCalleeSavedRegsAndAdjustStack();
|
ABI_PopAllCalleeSavedRegsAndAdjustStack();
|
||||||
#endif
|
|
||||||
RET();
|
RET();
|
||||||
|
|
||||||
breakpointBailout = GetCodePtr();
|
breakpointBailout = GetCodePtr();
|
||||||
#ifdef _M_IX86
|
|
||||||
POP(EDI);
|
|
||||||
POP(ESI);
|
|
||||||
POP(EBX);
|
|
||||||
POP(EBP);
|
|
||||||
#else
|
|
||||||
//Landing pad for drec space
|
//Landing pad for drec space
|
||||||
ABI_PopAllCalleeSavedRegsAndAdjustStack();
|
ABI_PopAllCalleeSavedRegsAndAdjustStack();
|
||||||
#endif
|
|
||||||
RET();
|
RET();
|
||||||
|
|
||||||
GenerateCommon();
|
GenerateCommon();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user