mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-02-15 08:31:58 +00:00
- Minor optimization to execute_ppc() as we apparently don't need to move
target PC into CTR. - Fix breakage introduced during little endian fixing. We now assume that MacOS doesn't rely on any PPC register that may have been saved on top of it stack. i.e. register state is saved onto native stack.
This commit is contained in:
parent
1012da75dd
commit
ebb67f0421
@ -330,15 +330,17 @@ void sheepshaver_cpu::execute_68k(uint32 entry, M68kRegisters *r)
|
|||||||
uint32 saved_ctr= ctr();
|
uint32 saved_ctr= ctr();
|
||||||
|
|
||||||
// Create MacOS stack frame
|
// Create MacOS stack frame
|
||||||
|
// FIXME: make sure MacOS doesn't expect PPC registers to live on top
|
||||||
uint32 sp = gpr(1);
|
uint32 sp = gpr(1);
|
||||||
gpr(1) -= 56 + 19*4 + 18*8;
|
gpr(1) -= 56;
|
||||||
WriteMacInt32(gpr(1), sp);
|
WriteMacInt32(gpr(1), sp);
|
||||||
|
|
||||||
// Save PowerPC registers
|
// Save PowerPC registers
|
||||||
for (int i = 13; i < 32; i++)
|
uint32 saved_GPRs[19];
|
||||||
WriteMacInt32(gpr(1) + 56 + i*4, gpr(i));
|
memcpy(&saved_GPRs[0], &gpr(13), sizeof(uint32)*(32-13));
|
||||||
#if SAVE_FP_EXEC_68K
|
#if SAVE_FP_EXEC_68K
|
||||||
memcpy(Mac2HostAddr(gpr(1)+56+19*4), &fpr(14), sizeof(double)*(32-14));
|
double saved_FPRs[18];
|
||||||
|
memcpy(&saved_FPRs[0], &fpr(14), sizeof(double)*(32-14));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Setup registers for 68k emulator
|
// Setup registers for 68k emulator
|
||||||
@ -385,14 +387,13 @@ void sheepshaver_cpu::execute_68k(uint32 entry, M68kRegisters *r)
|
|||||||
r->a[i] = gpr(16 + i);
|
r->a[i] = gpr(16 + i);
|
||||||
|
|
||||||
// Restore PowerPC registers
|
// Restore PowerPC registers
|
||||||
for (int i = 13; i < 32; i++)
|
memcpy(&gpr(13), &saved_GPRs[0], sizeof(uint32)*(32-13));
|
||||||
gpr(i) = ReadMacInt32(gpr(1) + 56 + i*4);
|
|
||||||
#if SAVE_FP_EXEC_68K
|
#if SAVE_FP_EXEC_68K
|
||||||
memcpy(&fpr(14), Mac2HostAddr(gpr(1)+56+19*4), sizeof(double)*(32-14));
|
memcpy(&fpr(14), &saved_FPRs[0], sizeof(double)*(32-14));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Cleanup stack
|
// Cleanup stack
|
||||||
gpr(1) += 56 + 19*4 + 18*8;
|
gpr(1) += 56;
|
||||||
|
|
||||||
// Restore program counters and branch registers
|
// Restore program counters and branch registers
|
||||||
pc() = saved_pc;
|
pc() = saved_pc;
|
||||||
@ -449,17 +450,14 @@ inline void sheepshaver_cpu::execute_ppc(uint32 entry)
|
|||||||
{
|
{
|
||||||
// Save branch registers
|
// Save branch registers
|
||||||
uint32 saved_lr = lr();
|
uint32 saved_lr = lr();
|
||||||
uint32 saved_ctr= ctr();
|
|
||||||
|
|
||||||
const uint32 trampoline[] = { htonl(POWERPC_EMUL_OP | 1) };
|
const uint32 trampoline[] = { htonl(POWERPC_EMUL_OP | 1) };
|
||||||
|
|
||||||
lr() = (uint32)trampoline;
|
lr() = (uint32)trampoline;
|
||||||
ctr()= entry;
|
|
||||||
execute(entry);
|
execute(entry);
|
||||||
|
|
||||||
// Restore branch registers
|
// Restore branch registers
|
||||||
lr() = saved_lr;
|
lr() = saved_lr;
|
||||||
ctr()= saved_ctr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resource Manager thunk
|
// Resource Manager thunk
|
||||||
|
Loading…
x
Reference in New Issue
Block a user