@@ -192,22 +192,27 @@ static PPCOpcode OpcodeGrabber[64 * 2048];
192192 everything else is the same.*/
193193static PPCOpcode OpcodeGrabberNoFPU[64 * 2048 ];
194194
195- void ppc_msr_did_change (uint32_t old_msr_val, bool set_next_instruction_address) {
196- bool old_fp = old_msr_val & MSR ::FP ;
197- bool new_fp = ppc_state.msr & MSR ::FP ;
198- if (old_fp != new_fp) {
195+ void ppc_msr_did_change (uint32_t old_msr_val, uint32_t new_msr_val, bool set_next_instruction_address) {
196+ ppc_state.msr = new_msr_val;
197+ if ((old_msr_val ^ new_msr_val) & MSR ::FP ) {
198+ bool newFP = (new_msr_val & MSR ::FP ) != 0 ;
199+ ppc_opcode_grabber = newFP ? OpcodeGrabber : OpcodeGrabberNoFPU;
200+ // LOG_F(INFO, "changed FP to %s", newFP ? "yes" : "no");
201+ #if 1
199202 exec_flags |= EXEF_OPC_DECODER ;
200203 if (set_next_instruction_address) {
201204 // Even though we're setting an exception flag, we want normal
202205 // instruction execution to continue.
203206 ppc_next_instruction_address = ppc_state.pc + 4 ;
204207 }
208+ #else
209+ power_on = false;
210+ power_off_reason = po_endian_switch;
211+ #endif
205212 }
206213}
207214
208- PPCOpcode* ppc_opcode_grabber () {
209- return ppc_state.msr & MSR ::FP ? OpcodeGrabber : OpcodeGrabberNoFPU;
210- }
215+ PPCOpcode* ppc_opcode_grabber = OpcodeGrabberNoFPU;
211216
212217/* * Exception helpers. */
213218
@@ -296,7 +301,7 @@ static void ppc_exec_inner(uint32_t start_addr, uint32_t size)
296301 uint64_t max_cycles = 0 ;
297302 uint32_t page_start, eb_start, eb_end = 0 ;
298303 uint32_t opcode;
299- PPCOpcode* opcode_grabber = ppc_opcode_grabber () ;
304+ PPCOpcode* opcode_grabber = ppc_opcode_grabber;
300305 uint8_t * pc_real;
301306
302307 while (power_on) {
@@ -321,7 +326,7 @@ static void ppc_exec_inner(uint32_t start_addr, uint32_t size)
321326
322327 if (exec_flags) {
323328 if (exec_flags & EXEF_OPC_DECODER ) [[unlikely]] {
324- opcode_grabber = ppc_opcode_grabber () ;
329+ opcode_grabber = ppc_opcode_grabber;
325330 }
326331 // define next execution block
327332 eb_start = ppc_next_instruction_address;
@@ -377,7 +382,7 @@ void ppc_exec_single()
377382
378383 uint8_t * pc_real = mmu_translate_imem (ppc_state.pc );
379384 uint32_t opcode = ppc_read_instruction (pc_real);
380- ppc_main_opcode (ppc_opcode_grabber () , opcode);
385+ ppc_main_opcode (ppc_opcode_grabber, opcode);
381386 g_icycles++;
382387 process_events ();
383388
@@ -395,18 +400,15 @@ void ppc_exec_single()
395400template void ppc_exec_inner<until>(uint32_t start_addr, uint32_t size);
396401
397402// outer interpreter loop
398- void ppc_exec_until (volatile uint32_t goal_addr)
399- {
403+ void ppc_exec_until (volatile uint32_t goal_addr) {
400404 if (setjmp (exc_env)) {
401405 // process low-level exceptions
402- // LOG_F(9, "PPC-EXEC: low_level exception raised!");
406+ // LOG_F(9, "PPC-EXEC: low_level exception raised!");
403407 ppc_state.pc = ppc_next_instruction_address;
404408 }
405409
406410 while (power_on) {
407411 ppc_exec_inner<until>(goal_addr, 0 );
408- if (ppc_state.pc == goal_addr)
409- break ;
410412 }
411413}
412414
@@ -845,13 +847,15 @@ void ppc_cpu_init(MemCtrlBase* mem_ctrl, uint32_t cpu_version, bool do_include_6
845847 dec_wr_value = 0 ;
846848
847849
850+ uint32_t new_msr_val;
848851 if (is_601) {
849852 /* MPC601 sets MSR[ME] bit during hard reset / Power-On */
850- ppc_state. msr = (MSR ::ME + MSR ::IP );
853+ new_msr_val = (MSR ::ME + MSR ::IP );
851854 } else {
852- ppc_state. msr = MSR ::IP ;
855+ new_msr_val = MSR ::IP ;
853856 ppc_state.spr [SPR ::DEC_S ] = 0xFFFFFFFFUL ;
854857 }
858+ ppc_msr_did_change (new_msr_val, new_msr_val, false );
855859
856860 ppc_mmu_init ();
857861
@@ -913,8 +917,8 @@ static uint64_t reg_op(string& reg_name, uint64_t val, bool is_write) {
913917 if (reg_name_u == " MSR" ) {
914918 if (is_write) {
915919 uint32_t old_msr_val = ppc_state.msr ;
916- ppc_state. msr = (uint32_t )val;
917- ppc_msr_did_change (old_msr_val);
920+ uint32_t new_msr_val = (uint32_t )val;
921+ ppc_msr_did_change (old_msr_val, new_msr_val, false );
918922 }
919923 return ppc_state.msr ;
920924 }
0 commit comments