diff --git a/tools/virtualmips/mips_codetable.c b/tools/virtualmips/mips_codetable.c index c2cd4c8..d70d220 100644 --- a/tools/virtualmips/mips_codetable.c +++ b/tools/virtualmips/mips_codetable.c @@ -9,11 +9,15 @@ static int unknown_op (cpu_mips_t * cpu, mips_insn_t insn) { +#if 0 printf ("--- Unknown instruction:\n"); printf ("%08x: %08x ", cpu->pc, insn); print_mips (cpu->pc, insn, cpu->insn_len, cpu->is_mips16e, stdout); printf ("\n"); exit (EXIT_FAILURE); +#endif + mips_trigger_exception (cpu, MIPS_CP0_CAUSE_ILLOP, cpu->is_in_bdslot); + return 1; } static int add_op (cpu_mips_t * cpu, mips_insn_t insn) @@ -592,36 +596,6 @@ static int cop2_op (cpu_mips_t * cpu, mips_insn_t insn) return unknown_op (cpu, insn); } -static int dadd_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int daddi_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int daddiu_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int daddu_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int ddiv_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int ddivu_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - static int div_op (cpu_mips_t * cpu, mips_insn_t insn) { int rs = bits (insn, 21, 25); @@ -656,81 +630,6 @@ static int divu_op (cpu_mips_t * cpu, mips_insn_t insn) } -static int dmfc0_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dmtc0_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dmult_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dmultu_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsll_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsllv_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsrlv_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsrav_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsub_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsubu_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsrl_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsra_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsll32_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsrl32_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int dsra32_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - static int eret_op (cpu_mips_t * cpu, mips_insn_t insn) { #if 1 @@ -870,31 +769,6 @@ static int lbu_op (cpu_mips_t * cpu, mips_insn_t insn) return (mips_exec_memop2 (cpu, MIPS_MEMOP_LBU, base, offset, rt, TRUE)); } -static int ld_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int ldc1_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int ldc2_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int ldl_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int ldr_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - static int lh_op (cpu_mips_t * cpu, mips_insn_t insn) { int base = bits (insn, 21, 25); @@ -922,11 +796,6 @@ static int ll_op (cpu_mips_t * cpu, mips_insn_t insn) return (mips_exec_memop2 (cpu, MIPS_MEMOP_LL, base, offset, rt, TRUE)); } -static int lld_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - static int lui_op (cpu_mips_t * cpu, mips_insn_t insn) { int rt = bits (insn, 16, 20); @@ -981,15 +850,6 @@ static int lwr_op (cpu_mips_t * cpu, mips_insn_t insn) return (mips_exec_memop2 (cpu, MIPS_MEMOP_LWR, base, offset, rt, TRUE)); } -static int lwu_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - int base = bits (insn, 21, 25); - int rt = bits (insn, 16, 20); - int offset = bits (insn, 0, 15); - - return (mips_exec_memop2 (cpu, MIPS_MEMOP_LWU, base, offset, rt, TRUE)); -} - static int spec3_op (cpu_mips_t * cpu, mips_insn_t insn) { int index = bits (insn, 0, 5); @@ -1310,41 +1170,6 @@ static int sc_op (cpu_mips_t * cpu, mips_insn_t insn) return (mips_exec_memop2 (cpu, MIPS_MEMOP_SC, base, offset, rt, TRUE)); } -static int scd_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int sd_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int sdc1_op (cpu_mips_t * cpu, mips_insn_t insn) -{ -#if SOFT_FPU - mips_exec_soft_fpu (cpu); - return (1); -#else - return unknown_op (cpu, insn); -#endif -} - -static int sdc2_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int sdl_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - -static int sdr_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - return unknown_op (cpu, insn); -} - static int sh_op (cpu_mips_t * cpu, mips_insn_t insn) { int base = bits (insn, 21, 25); @@ -1616,26 +1441,6 @@ static int teqi_op (cpu_mips_t * cpu, mips_insn_t insn) return (0); } -static int mfmc0_op (cpu_mips_t * cpu, mips_insn_t insn) -{ - int rt = bits (insn, 16, 20); - int rd = bits (insn, 11, 15); - int func = bits (insn, 0, 5); - - if (rd != 12) - return unknown_op (cpu, insn); - - cpu->reg_set (cpu, rt, cpu->cp0.reg [MIPS_CP0_STATUS]); - if (func & 0x20) { - /* ei - enable interrupts */ - cpu->cp0.reg [MIPS_CP0_STATUS] |= MIPS_CP0_STATUS_IE; - } else { - /* di - disable interrupts */ - cpu->cp0.reg [MIPS_CP0_STATUS] &= ~MIPS_CP0_STATUS_IE; - } - return 0; -} - static int tlb_op (cpu_mips_t * cpu, mips_insn_t insn) { uint16_t func = bits (insn, 0, 5); @@ -1919,10 +1724,10 @@ static const struct mips_op_desc mips_opcodes[] = { {"bnel", bnel_op, 0x15}, {"blezl", blezl_op, 0x16}, {"bgtzl", bgtzl_op, 0x17}, - {"daddi", daddi_op, 0x18}, - {"daddiu", daddiu_op, 0x19}, - {"ldl", ldl_op, 0x1A}, - {"ldr", ldr_op, 0x1B}, + {"daddi", unknown_op, 0x18}, + {"daddiu", unknown_op, 0x19}, + {"ldl", unknown_op, 0x1A}, + {"ldr", unknown_op, 0x1B}, {"spec2", spec2_op, 0x1C}, /* indexed by FUNC field */ {"jalx", jalx_op, 0x1D}, {"undef", undef_op, 0x1E}, @@ -1934,31 +1739,31 @@ static const struct mips_op_desc mips_opcodes[] = { {"lbu", lbu_op, 0x24}, {"lhu", lhu_op, 0x25}, {"lwr", lwr_op, 0x26}, - {"lwu", lwu_op, 0x27}, + {"lwu", unknown_op, 0x27}, {"sb", sb_op, 0x28}, {"sh", sh_op, 0x29}, {"swl", swl_op, 0x2A}, {"sw", sw_op, 0x2B}, - {"sdl", sdl_op, 0x2C}, - {"sdr", sdr_op, 0x2D}, + {"sdl", unknown_op, 0x2C}, + {"sdr", unknown_op, 0x2D}, {"swr", swr_op, 0x2E}, {"cache", cache_op, 0x2F}, {"ll", ll_op, 0x30}, {"lwc1", lwc1_op, 0x31}, {"lwc2", lwc2_op, 0x32}, {"pref", pref_op, 0x33}, - {"lld", lld_op, 0x34}, - {"ldc1", ldc1_op, 0x35}, - {"ldc2", ldc2_op, 0x36}, - {"ld", ld_op, 0x37}, + {"lld", unknown_op, 0x34}, + {"ldc1", unknown_op, 0x35}, + {"ldc2", unknown_op, 0x36}, + {"ld", unknown_op, 0x37}, {"sc", sc_op, 0x38}, {"swc1", swc1_op, 0x39}, {"swc2", swc2_op, 0x3A}, {"undef", undef_op, 0x3B}, - {"scd", scd_op, 0x3C}, - {"sdc1", sdc1_op, 0x3D}, - {"sdc2", sdc2_op, 0x3E}, - {"sd", sd_op, 0x3F}, + {"scd", unknown_op, 0x3C}, + {"sdc1", unknown_op, 0x3D}, + {"sdc2", unknown_op, 0x3E}, + {"sd", unknown_op, 0x3F}, }; /* @@ -1985,18 +1790,18 @@ static const struct mips_op_desc mips_spec_opcodes[] = { {"mthi", mthi_op, 0x11}, {"mflo", mflo_op, 0x12}, {"mtlo", mtlo_op, 0x13}, - {"dsllv", dsllv_op, 0x14}, + {"dsllv", unknown_op, 0x14}, {"?spec", undef_spec, 0x15}, - {"dsrlv", dsrlv_op, 0x16}, - {"dsrav", dsrav_op, 0x17}, + {"dsrlv", unknown_op, 0x16}, + {"dsrav", unknown_op, 0x17}, {"mult", mult_op, 0x18}, {"multu", multu_op, 0x19}, {"div", div_op, 0x1A}, {"divu", divu_op, 0x1B}, - {"dmult", dmult_op, 0x1C}, - {"dmultu", dmultu_op, 0x1D}, - {"ddiv", ddiv_op, 0x1E}, - {"ddivu", ddivu_op, 0x1F}, + {"dmult", unknown_op, 0x1C}, + {"dmultu", unknown_op, 0x1D}, + {"ddiv", unknown_op, 0x1E}, + {"ddivu", unknown_op, 0x1F}, {"add", add_op, 0x20}, {"addu", addu_op, 0x21}, {"sub", sub_op, 0x22}, @@ -2009,10 +1814,10 @@ static const struct mips_op_desc mips_spec_opcodes[] = { {"?spec", undef_spec, 0x29}, {"slt", slt_op, 0x2A}, {"sltu", sltu_op, 0x2B}, - {"dadd", dadd_op, 0x2C}, - {"daddu", daddu_op, 0x2D}, - {"dsub", dsub_op, 0x2E}, - {"dsubu", dsubu_op, 0x2F}, + {"dadd", unknown_op, 0x2C}, + {"daddu", unknown_op, 0x2D}, + {"dsub", unknown_op, 0x2E}, + {"dsubu", unknown_op, 0x2F}, {"tge", tge_op, 0x30}, {"tgeu", tgeu_op, 0x31}, {"tlt", tlt_op, 0x32}, @@ -2021,14 +1826,14 @@ static const struct mips_op_desc mips_spec_opcodes[] = { {"?spec", undef_spec, 0x35}, {"tne", tne_op, 0x36}, {"?spec", undef_spec, 0x37}, - {"dsll", dsll_op, 0x38}, + {"dsll", unknown_op, 0x38}, {"?spec", undef_spec, 0x39}, - {"dsrl", dsrl_op, 0x3A}, - {"dsra", dsra_op, 0x3B}, - {"dsll32", dsll32_op, 0x3C}, + {"dsrl", unknown_op, 0x3A}, + {"dsra", unknown_op, 0x3B}, + {"dsll32", unknown_op, 0x3C}, {"?spec", undef_spec, 0x3D}, - {"dsrl32", dsrl32_op, 0x3E}, - {"dsra32", dsra32_op, 0x3F} + {"dsrl32", unknown_op, 0x3E}, + {"dsra32", unknown_op, 0x3F} }; /* @@ -2074,17 +1879,17 @@ static const struct mips_op_desc mips_bcond_opcodes[] = { */ static const struct mips_op_desc mips_cop0_opcodes[] = { {"mfc0", mfc0_op, 0x0}, - {"dmfc0", dmfc0_op, 0x1}, + {"dmfc0", unknown_op, 0x1}, {"cfc0", cfc0_op, 0x2}, {"?cop0", undef_cop0, 0x3}, {"mtc0", mtc0_op, 0x4}, - {"dmtc0", dmtc0_op, 0x5}, + {"dmtc0", unknown_op, 0x5}, {"?cop0", undef_cop0, 0x6}, {"?cop0", undef_cop0, 0x7}, {"?cop0", undef_cop0, 0x8}, {"?cop0", undef_cop0, 0x9}, {"?cop0", rdpgpr_op, 0xa}, - {"?cop0", mfmc0_op, 0xb}, + {"?cop0", undef_cop0, 0xb}, {"?cop0", undef_cop0, 0xc}, {"?cop0", undef_cop0, 0xd}, {"wrpgpr", wrpgpr_op, 0xe},