2111 lines
72 KiB
C
2111 lines
72 KiB
C
/* This file is part of GDB.
|
|
|
|
Copyright 2002, 2007 Free Software Foundation, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
--
|
|
|
|
This file was generated by the program igen */
|
|
|
|
#ifndef ENGINE_C
|
|
#define ENGINE_C
|
|
|
|
|
|
#include "sim-inline.c"
|
|
|
|
#if C_REVEALS_MODULE_P (ITABLE_INLINE)
|
|
#include "itable.c"
|
|
#else
|
|
#include "itable.h"
|
|
#endif
|
|
|
|
#if C_REVEALS_MODULE_P (IDECODE_INLINE)
|
|
#include "idecode.c"
|
|
#else
|
|
#include "idecode.h"
|
|
#endif
|
|
|
|
#if C_REVEALS_MODULE_P (SUPPORT_INLINE)
|
|
#include "support.c"
|
|
#else
|
|
#include "support.h"
|
|
#endif
|
|
|
|
#if C_REVEALS_MODULE_P (SEMANTICS_INLINE)
|
|
#include "semantics.c"
|
|
#else
|
|
#include "semantics.h"
|
|
#endif
|
|
|
|
#include "engine.h"
|
|
|
|
#include "sim-assert.h"
|
|
|
|
enum {
|
|
/* greater or equal to zero => table */
|
|
function_entry = -1,
|
|
boolean_entry = -2,
|
|
};
|
|
|
|
typedef struct _idecode_table_entry {
|
|
int shift;
|
|
uint32_t mask;
|
|
uint32_t value;
|
|
void *function_or_table;
|
|
} idecode_table_entry;
|
|
|
|
|
|
INLINE_ENGINE\
|
|
(void) engine_run
|
|
(SIM_DESC sd,
|
|
int next_cpu_nr,
|
|
int nr_cpus,
|
|
int siggnal)
|
|
{
|
|
instruction_address cia;
|
|
int current_cpu = next_cpu_nr;
|
|
/* CASE 1: NO SMP (with or with out instruction cache).
|
|
|
|
In this case, we can take advantage of the fact that the current
|
|
instruction address (CIA) does not need to be read from / written to
|
|
the CPU object after the execution of an instruction.
|
|
|
|
Instead, CIA is only saved when the main loop exits. This occures
|
|
when either sim_engine_halt or sim_engine_restart is called. Both of
|
|
these functions save the current instruction address before halting /
|
|
restarting the simulator.
|
|
|
|
As a variation, there may also be support for an instruction cracking
|
|
cache. */
|
|
|
|
|
|
/* prime the main loop */
|
|
SIM_ASSERT (current_cpu == 0);
|
|
SIM_ASSERT (nr_cpus == 1);
|
|
cia = CPU_PC_GET (CPU);
|
|
|
|
while (1)
|
|
{
|
|
instruction_address nia;
|
|
|
|
instruction_word instruction_0 = IMEM32 (cia);
|
|
|
|
#if defined (ENGINE_ISSUE_PREFIX_HOOK)
|
|
ENGINE_ISSUE_PREFIX_HOOK();
|
|
#endif
|
|
|
|
switch (EXTRACTED32 (instruction_0, 31, 26))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 5, 0))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_SLLa_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MOVtf_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_SRL_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_SRA_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
nia = semantic_SLLV_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
nia = semantic_SRLV_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
nia = semantic_SRAV_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
nia = semantic_JR_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
nia = semantic_JALR_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 10:
|
|
{
|
|
nia = semantic_MOVZ_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 11:
|
|
{
|
|
nia = semantic_MOVN_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 12:
|
|
{
|
|
nia = semantic_SYSCALL_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 13:
|
|
{
|
|
nia = semantic_BREAK_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 15:
|
|
{
|
|
nia = semantic_SYNC_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
nia = semantic_MFHI_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 17:
|
|
{
|
|
nia = semantic_MTHI_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
nia = semantic_MFLO_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 19:
|
|
{
|
|
nia = semantic_MTLO_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 24:
|
|
{
|
|
nia = semantic_MULT_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 25:
|
|
{
|
|
nia = semantic_MULTU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 26:
|
|
{
|
|
nia = semantic_DIV_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 27:
|
|
{
|
|
nia = semantic_DIVU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 32:
|
|
{
|
|
nia = semantic_ADD_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 33:
|
|
{
|
|
nia = semantic_ADDU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 34:
|
|
{
|
|
nia = semantic_SUB_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 35:
|
|
{
|
|
nia = semantic_SUBU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 36:
|
|
{
|
|
nia = semantic_AND_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 37:
|
|
{
|
|
nia = semantic_OR_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 38:
|
|
{
|
|
nia = semantic_XOR_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 39:
|
|
{
|
|
nia = semantic_NOR_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 42:
|
|
{
|
|
nia = semantic_SLT_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 43:
|
|
{
|
|
nia = semantic_SLTU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 48:
|
|
{
|
|
nia = semantic_TGE_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 49:
|
|
{
|
|
nia = semantic_TGEU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 50:
|
|
{
|
|
nia = semantic_TLT_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 51:
|
|
{
|
|
nia = semantic_TLTU_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 52:
|
|
{
|
|
nia = semantic_TEQ_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 54:
|
|
{
|
|
nia = semantic_TNE_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 57:
|
|
{
|
|
nia = semantic_RSVD_SPECIAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 20, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_BLTZ_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_BGEZ_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BLTZL_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_BGEZL_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
nia = semantic_TGEI_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
nia = semantic_TGEIU_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 10:
|
|
{
|
|
nia = semantic_TLTI_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 11:
|
|
{
|
|
nia = semantic_TLTIU_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 12:
|
|
{
|
|
nia = semantic_TEQI_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 14:
|
|
{
|
|
nia = semantic_TNEI_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
nia = semantic_BLTZAL_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 17:
|
|
{
|
|
nia = semantic_BGEZAL_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
nia = semantic_BLTZALL_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 19:
|
|
{
|
|
nia = semantic_BGEZALL_REGIMM (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_J_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_JAL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
nia = semantic_BEQ_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
nia = semantic_BNE_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
nia = semantic_BLEZ_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
nia = semantic_BGTZ_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
nia = semantic_ADDI_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
nia = semantic_ADDIU_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 10:
|
|
{
|
|
nia = semantic_SLTI_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 11:
|
|
{
|
|
nia = semantic_SLTIU_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 12:
|
|
{
|
|
nia = semantic_ANDI_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 13:
|
|
{
|
|
nia = semantic_ORI_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 14:
|
|
{
|
|
nia = semantic_XORI_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 15:
|
|
{
|
|
nia = semantic_LUI_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 4, 0))
|
|
{
|
|
case 0:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 7:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
nia = semantic_TLBR_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
nia = semantic_TLBWI_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
nia = semantic_TLBWR_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 24, 23))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_MTC0_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 24))
|
|
{
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_TLBP_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
case 17:
|
|
case 18:
|
|
case 19:
|
|
case 20:
|
|
case 21:
|
|
case 22:
|
|
case 23:
|
|
case 25:
|
|
case 26:
|
|
case 27:
|
|
case 28:
|
|
case 29:
|
|
case 30:
|
|
case 31:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 24))
|
|
{
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_RFE_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 24:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 17, 16))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 24))
|
|
{
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0F_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_ERET_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
nia = semantic_BC0T_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_BC0FL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
nia = semantic_BC0TL_COP0 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 17:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 5, 0))
|
|
{
|
|
case 0:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_MFC1b_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
nia = semantic_CFC1b_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
nia = semantic_MTC1b_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
nia = semantic_CTC1b_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_ADD_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_SUB_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_MUL_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_DIV_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_SQRT_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_ABS_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_MOV_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_NEG_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_ROUND_L_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_TRUNC_L_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 10:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_CEIL_L_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 11:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_FLOOR_L_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 12:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_ROUND_W_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 13:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_TRUNC_W_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 14:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_CEIL_W_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 15:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_FLOOR_W_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 16:
|
|
case 20:
|
|
case 23:
|
|
case 24:
|
|
case 25:
|
|
case 26:
|
|
case 27:
|
|
case 28:
|
|
case 29:
|
|
case 30:
|
|
case 31:
|
|
case 34:
|
|
case 35:
|
|
case 38:
|
|
case 39:
|
|
case 40:
|
|
case 41:
|
|
case 42:
|
|
case 43:
|
|
case 44:
|
|
case 45:
|
|
case 46:
|
|
case 47:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 17:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_MOVtf_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_MOVZ_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 19:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_MOVN_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 21:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_RECIP_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 22:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_RSQRT_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 32:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 17:
|
|
case 20:
|
|
case 21:
|
|
{
|
|
nia = semantic_CVT_S_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 33:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 20:
|
|
case 21:
|
|
{
|
|
nia = semantic_CVT_D_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 36:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_CVT_W_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 37:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
{
|
|
nia = semantic_CVT_L_fmt_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 48:
|
|
case 49:
|
|
case 50:
|
|
case 51:
|
|
case 52:
|
|
case 53:
|
|
case 54:
|
|
case 55:
|
|
case 56:
|
|
case 57:
|
|
case 58:
|
|
case 59:
|
|
case 60:
|
|
case 61:
|
|
case 62:
|
|
case 63:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 25, 21))
|
|
{
|
|
case 8:
|
|
{
|
|
nia = semantic_BC1b_COP1S (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 16:
|
|
case 17:
|
|
case 22:
|
|
{
|
|
nia = semantic_C_cond_fmtb_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
nia = semantic_COPz_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 19:
|
|
{
|
|
{
|
|
switch (EXTRACTED32 (instruction_0, 5, 0))
|
|
{
|
|
case 0:
|
|
{
|
|
nia = semantic_LWXC1_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
nia = semantic_SWXC1_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 15:
|
|
{
|
|
nia = semantic_PREFX_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 32:
|
|
case 33:
|
|
case 38:
|
|
{
|
|
nia = semantic_MADD_fmt_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 40:
|
|
case 41:
|
|
case 46:
|
|
{
|
|
nia = semantic_MSUB_fmt_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 48:
|
|
case 49:
|
|
case 54:
|
|
{
|
|
nia = semantic_NMADD_fmt_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 56:
|
|
case 57:
|
|
case 62:
|
|
{
|
|
nia = semantic_NMSUB_fmt_COP1X (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 20:
|
|
{
|
|
nia = semantic_BEQL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 21:
|
|
{
|
|
nia = semantic_BNEL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 22:
|
|
{
|
|
nia = semantic_BLEZL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 23:
|
|
{
|
|
nia = semantic_BGTZL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 24:
|
|
case 25:
|
|
case 26:
|
|
case 27:
|
|
case 28:
|
|
case 29:
|
|
case 30:
|
|
case 31:
|
|
case 39:
|
|
case 44:
|
|
case 45:
|
|
case 52:
|
|
case 54:
|
|
case 55:
|
|
case 59:
|
|
case 60:
|
|
case 62:
|
|
case 63:
|
|
{
|
|
nia = semantic_illegal (sd, cia);
|
|
break;
|
|
}
|
|
case 32:
|
|
{
|
|
nia = semantic_LB_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 33:
|
|
{
|
|
nia = semantic_LH_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 34:
|
|
{
|
|
nia = semantic_LWL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 35:
|
|
{
|
|
nia = semantic_LW_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 36:
|
|
{
|
|
nia = semantic_LBU_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 37:
|
|
{
|
|
nia = semantic_LHU_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 38:
|
|
{
|
|
nia = semantic_LWR_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 40:
|
|
{
|
|
nia = semantic_SB_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 41:
|
|
{
|
|
nia = semantic_SH_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 42:
|
|
{
|
|
nia = semantic_SWL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 43:
|
|
{
|
|
nia = semantic_SW_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 46:
|
|
{
|
|
nia = semantic_SWR_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 47:
|
|
{
|
|
nia = semantic_CACHE_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 48:
|
|
{
|
|
nia = semantic_LL_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 49:
|
|
{
|
|
nia = semantic_LWC1_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 50:
|
|
{
|
|
nia = semantic_LWCz_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 51:
|
|
{
|
|
nia = semantic_PREF_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 53:
|
|
{
|
|
nia = semantic_LDC1b_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 56:
|
|
{
|
|
nia = semantic_SC_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 57:
|
|
{
|
|
nia = semantic_SWC1_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 58:
|
|
{
|
|
nia = semantic_SWCz_NORMAL (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
case 61:
|
|
{
|
|
nia = semantic_SDC1b_COP1 (sd, instruction_0, cia);
|
|
break;
|
|
}
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "Internal error - bad switch generated");
|
|
nia = NULL_CIA;
|
|
break;
|
|
}
|
|
|
|
#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);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif /* _ENGINE_C_*/
|