void sim_engine_run (SIM_DESC sd, int next_cpu_nr, int nr_cpus, int signal) { micromips_m32_instruction_word instruction_0; sim_cpu *cpu = STATE_CPU (sd, next_cpu_nr); micromips32_instruction_address cia = CPU_PC_GET (cpu); sd->isa_mode = ISA_MODE_MIPS32; while (1) { micromips32_instruction_address nia; /* Allow us to switch back from MIPS32 to microMIPS This covers two cases: 1. Setting the correct isa mode based on the start address from the elf header. 2. Setting the correct isa mode after a MIPS32 jump or branch instruction. */ if ((sd->isa_mode == ISA_MODE_MIPS32) && ((cia & 0x1) == ISA_MODE_MICROMIPS)) { sd->isa_mode = ISA_MODE_MICROMIPS; cia = cia & ~0x1; } #if defined (ENGINE_ISSUE_PREFIX_HOOK) ENGINE_ISSUE_PREFIX_HOOK (); #endif switch (sd->isa_mode) { case ISA_MODE_MICROMIPS: nia = micromips_instruction_decode (sd, cpu, cia, MICROMIPS_DELAYSLOT_SIZE_ANY); break; case ISA_MODE_MIPS32: instruction_0 = IMEM32 (cia); nia = micromips_m32_idecode_issue (sd, instruction_0, cia); break; default: nia = NULL_CIA; } #if defined (ENGINE_ISSUE_POSTFIX_HOOK) ENGINE_ISSUE_POSTFIX_HOOK (); #endif /* Update the instruction address */ cia = nia; /* process any events */ if (sim_events_tick (sd)) { CPU_PC_SET (cpu, cia); sim_events_process (sd); cia = CPU_PC_GET (cpu); } } }
void sim_engine_run (SIM_DESC sd, int next_cpu_nr, int nr_cpus, /* ignore */ int siggnal) /* ignore */ { sim_cpu *cpu = STATE_CPU (sd, next_cpu_nr); address_word cia = CPU_PC_GET (cpu); while (1) { address_word nia; #if defined (ENGINE_ISSUE_PREFIX_HOOK) ENGINE_ISSUE_PREFIX_HOOK (); #endif if ((cia & 1)) { m16_instruction_word instruction_0 = IMEM16 (cia); nia = m16_idecode_issue (sd, instruction_0, cia); } else { m32_instruction_word instruction_0 = IMEM32 (cia); nia = m32_idecode_issue (sd, instruction_0, cia); } #if defined (ENGINE_ISSUE_POSTFIX_HOOK) ENGINE_ISSUE_POSTFIX_HOOK (); #endif /* Update the instruction address */ cia = nia; /* process any events */ if (sim_events_tick (sd)) { CPU_PC_SET (CPU, cia); sim_events_process (sd); cia = CPU_PC_GET (CPU); } } }
void sim_engine_run (SIM_DESC sd, int next_cpu_nr, /* ignore */ int nr_cpus, /* ignore */ int siggnal) /* ignore */ { sim_cia cia; sim_cpu *cpu; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); cpu = STATE_CPU (sd, 0); cia = CIA_GET (cpu); while (1) { instruction_word insn = IMEM32 (cia); cia = idecode_issue (sd, insn, cia); /* process any events */ if (sim_events_tick (sd)) { CIA_SET (cpu, cia); sim_events_process (sd); } } }