- 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:
gbeauche 2003-10-11 09:33:27 +00:00
parent 1012da75dd
commit ebb67f0421

View File

@ -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