Use the standard ASE check for MIPS-3D and MT.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3427 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
ths 2007-10-23 17:04:27 +00:00
parent d8a5950a62
commit 7385ac0ba2
3 changed files with 80 additions and 93 deletions

View File

@ -32,6 +32,8 @@
#define ASE_MDMX 0x00004000 #define ASE_MDMX 0x00004000
#define ASE_DSP 0x00008000 #define ASE_DSP 0x00008000
#define ASE_DSPR2 0x00010000 #define ASE_DSPR2 0x00010000
#define ASE_MT 0x00020000
#define ASE_SMARTMIPS 0x00040000
/* Chip specific instructions. */ /* Chip specific instructions. */
/* Currently void */ /* Currently void */

View File

@ -749,12 +749,6 @@ static always_inline void check_cp1_64bitmode(DisasContext *ctx)
generate_exception(ctx, EXCP_RI); generate_exception(ctx, EXCP_RI);
} }
static always_inline void check_cp1_3d(CPUState *env, DisasContext *ctx)
{
if (unlikely(!(env->fpu->fcr0 & (1 << FCR0_3D))))
generate_exception(ctx, EXCP_RI);
}
/* /*
* Verify if floating point register is valid; an operation is not defined * Verify if floating point register is valid; an operation is not defined
* if bit 0 of any register specification is set and the FR bit in the * if bit 0 of any register specification is set and the FR bit in the
@ -780,14 +774,6 @@ static always_inline void check_insn(CPUState *env, DisasContext *ctx, int flags
generate_exception(ctx, EXCP_RI); generate_exception(ctx, EXCP_RI);
} }
/* This code generates a "reserved instruction" exception if the
CPU is not MIPS MT capable. */
static always_inline void check_mips_mt(CPUState *env, DisasContext *ctx)
{
if (unlikely(!(env->CP0_Config3 & (1 << CP0C3_MT))))
generate_exception(ctx, EXCP_RI);
}
/* This code generates a "reserved instruction" exception if 64-bit /* This code generates a "reserved instruction" exception if 64-bit
instructions are not enabled. */ instructions are not enabled. */
static always_inline void check_mips_64(DisasContext *ctx) static always_inline void check_mips_64(DisasContext *ctx)
@ -1971,17 +1957,17 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Index"; rn = "Index";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_mvpcontrol(); gen_op_mfc0_mvpcontrol();
rn = "MVPControl"; rn = "MVPControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_mvpconf0(); gen_op_mfc0_mvpconf0();
rn = "MVPConf0"; rn = "MVPConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_mvpconf1(); gen_op_mfc0_mvpconf1();
rn = "MVPConf1"; rn = "MVPConf1";
break; break;
@ -1996,37 +1982,37 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Random"; rn = "Random";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpecontrol(); gen_op_mfc0_vpecontrol();
rn = "VPEControl"; rn = "VPEControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeconf0(); gen_op_mfc0_vpeconf0();
rn = "VPEConf0"; rn = "VPEConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeconf1(); gen_op_mfc0_vpeconf1();
rn = "VPEConf1"; rn = "VPEConf1";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_yqmask(); gen_op_mfc0_yqmask();
rn = "YQMask"; rn = "YQMask";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeschedule(); gen_op_mfc0_vpeschedule();
rn = "VPESchedule"; rn = "VPESchedule";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeschefback(); gen_op_mfc0_vpeschefback();
rn = "VPEScheFBack"; rn = "VPEScheFBack";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeopt(); gen_op_mfc0_vpeopt();
rn = "VPEOpt"; rn = "VPEOpt";
break; break;
@ -2041,37 +2027,37 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "EntryLo0"; rn = "EntryLo0";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcstatus(); gen_op_mfc0_tcstatus();
rn = "TCStatus"; rn = "TCStatus";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcbind(); gen_op_mfc0_tcbind();
rn = "TCBind"; rn = "TCBind";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcrestart(); gen_op_mfc0_tcrestart();
rn = "TCRestart"; rn = "TCRestart";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tchalt(); gen_op_mfc0_tchalt();
rn = "TCHalt"; rn = "TCHalt";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tccontext(); gen_op_mfc0_tccontext();
rn = "TCContext"; rn = "TCContext";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcschedule(); gen_op_mfc0_tcschedule();
rn = "TCSchedule"; rn = "TCSchedule";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcschefback(); gen_op_mfc0_tcschefback();
rn = "TCScheFBack"; rn = "TCScheFBack";
break; break;
@ -2539,17 +2525,17 @@ static void gen_mtc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Index"; rn = "Index";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_mvpcontrol(); gen_op_mtc0_mvpcontrol();
rn = "MVPControl"; rn = "MVPControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
/* ignored */ /* ignored */
rn = "MVPConf0"; rn = "MVPConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
/* ignored */ /* ignored */
rn = "MVPConf1"; rn = "MVPConf1";
break; break;
@ -2564,37 +2550,37 @@ static void gen_mtc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Random"; rn = "Random";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpecontrol(); gen_op_mtc0_vpecontrol();
rn = "VPEControl"; rn = "VPEControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeconf0(); gen_op_mtc0_vpeconf0();
rn = "VPEConf0"; rn = "VPEConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeconf1(); gen_op_mtc0_vpeconf1();
rn = "VPEConf1"; rn = "VPEConf1";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_yqmask(); gen_op_mtc0_yqmask();
rn = "YQMask"; rn = "YQMask";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeschedule(); gen_op_mtc0_vpeschedule();
rn = "VPESchedule"; rn = "VPESchedule";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeschefback(); gen_op_mtc0_vpeschefback();
rn = "VPEScheFBack"; rn = "VPEScheFBack";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeopt(); gen_op_mtc0_vpeopt();
rn = "VPEOpt"; rn = "VPEOpt";
break; break;
@ -2609,37 +2595,37 @@ static void gen_mtc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "EntryLo0"; rn = "EntryLo0";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcstatus(); gen_op_mtc0_tcstatus();
rn = "TCStatus"; rn = "TCStatus";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcbind(); gen_op_mtc0_tcbind();
rn = "TCBind"; rn = "TCBind";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcrestart(); gen_op_mtc0_tcrestart();
rn = "TCRestart"; rn = "TCRestart";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tchalt(); gen_op_mtc0_tchalt();
rn = "TCHalt"; rn = "TCHalt";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tccontext(); gen_op_mtc0_tccontext();
rn = "TCContext"; rn = "TCContext";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcschedule(); gen_op_mtc0_tcschedule();
rn = "TCSchedule"; rn = "TCSchedule";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcschefback(); gen_op_mtc0_tcschefback();
rn = "TCScheFBack"; rn = "TCScheFBack";
break; break;
@ -3139,17 +3125,17 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Index"; rn = "Index";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_mvpcontrol(); gen_op_mfc0_mvpcontrol();
rn = "MVPControl"; rn = "MVPControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_mvpconf0(); gen_op_mfc0_mvpconf0();
rn = "MVPConf0"; rn = "MVPConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_mvpconf1(); gen_op_mfc0_mvpconf1();
rn = "MVPConf1"; rn = "MVPConf1";
break; break;
@ -3164,37 +3150,37 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Random"; rn = "Random";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpecontrol(); gen_op_mfc0_vpecontrol();
rn = "VPEControl"; rn = "VPEControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeconf0(); gen_op_mfc0_vpeconf0();
rn = "VPEConf0"; rn = "VPEConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeconf1(); gen_op_mfc0_vpeconf1();
rn = "VPEConf1"; rn = "VPEConf1";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_yqmask(); gen_op_dmfc0_yqmask();
rn = "YQMask"; rn = "YQMask";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_vpeschedule(); gen_op_dmfc0_vpeschedule();
rn = "VPESchedule"; rn = "VPESchedule";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_vpeschefback(); gen_op_dmfc0_vpeschefback();
rn = "VPEScheFBack"; rn = "VPEScheFBack";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_vpeopt(); gen_op_mfc0_vpeopt();
rn = "VPEOpt"; rn = "VPEOpt";
break; break;
@ -3209,37 +3195,37 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "EntryLo0"; rn = "EntryLo0";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcstatus(); gen_op_mfc0_tcstatus();
rn = "TCStatus"; rn = "TCStatus";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mfc0_tcbind(); gen_op_mfc0_tcbind();
rn = "TCBind"; rn = "TCBind";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_tcrestart(); gen_op_dmfc0_tcrestart();
rn = "TCRestart"; rn = "TCRestart";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_tchalt(); gen_op_dmfc0_tchalt();
rn = "TCHalt"; rn = "TCHalt";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_tccontext(); gen_op_dmfc0_tccontext();
rn = "TCContext"; rn = "TCContext";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_tcschedule(); gen_op_dmfc0_tcschedule();
rn = "TCSchedule"; rn = "TCSchedule";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmfc0_tcschefback(); gen_op_dmfc0_tcschefback();
rn = "TCScheFBack"; rn = "TCScheFBack";
break; break;
@ -3696,17 +3682,17 @@ static void gen_dmtc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Index"; rn = "Index";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_mvpcontrol(); gen_op_mtc0_mvpcontrol();
rn = "MVPControl"; rn = "MVPControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
/* ignored */ /* ignored */
rn = "MVPConf0"; rn = "MVPConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
/* ignored */ /* ignored */
rn = "MVPConf1"; rn = "MVPConf1";
break; break;
@ -3721,37 +3707,37 @@ static void gen_dmtc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "Random"; rn = "Random";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpecontrol(); gen_op_mtc0_vpecontrol();
rn = "VPEControl"; rn = "VPEControl";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeconf0(); gen_op_mtc0_vpeconf0();
rn = "VPEConf0"; rn = "VPEConf0";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeconf1(); gen_op_mtc0_vpeconf1();
rn = "VPEConf1"; rn = "VPEConf1";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_yqmask(); gen_op_mtc0_yqmask();
rn = "YQMask"; rn = "YQMask";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeschedule(); gen_op_mtc0_vpeschedule();
rn = "VPESchedule"; rn = "VPESchedule";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeschefback(); gen_op_mtc0_vpeschefback();
rn = "VPEScheFBack"; rn = "VPEScheFBack";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_vpeopt(); gen_op_mtc0_vpeopt();
rn = "VPEOpt"; rn = "VPEOpt";
break; break;
@ -3766,37 +3752,37 @@ static void gen_dmtc0 (CPUState *env, DisasContext *ctx, int reg, int sel)
rn = "EntryLo0"; rn = "EntryLo0";
break; break;
case 1: case 1:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcstatus(); gen_op_mtc0_tcstatus();
rn = "TCStatus"; rn = "TCStatus";
break; break;
case 2: case 2:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcbind(); gen_op_mtc0_tcbind();
rn = "TCBind"; rn = "TCBind";
break; break;
case 3: case 3:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcrestart(); gen_op_mtc0_tcrestart();
rn = "TCRestart"; rn = "TCRestart";
break; break;
case 4: case 4:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tchalt(); gen_op_mtc0_tchalt();
rn = "TCHalt"; rn = "TCHalt";
break; break;
case 5: case 5:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tccontext(); gen_op_mtc0_tccontext();
rn = "TCContext"; rn = "TCContext";
break; break;
case 6: case 6:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcschedule(); gen_op_mtc0_tcschedule();
rn = "TCSchedule"; rn = "TCSchedule";
break; break;
case 7: case 7:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_mtc0_tcschefback(); gen_op_mtc0_tcschefback();
rn = "TCScheFBack"; rn = "TCScheFBack";
break; break;
@ -4636,7 +4622,7 @@ static void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int
break; break;
#endif #endif
case OPC_MFTR: case OPC_MFTR:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
if (rd == 0) { if (rd == 0) {
/* Treat as NOP. */ /* Treat as NOP. */
return; return;
@ -4647,7 +4633,7 @@ static void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int
opn = "mftr"; opn = "mftr";
break; break;
case OPC_MTTR: case OPC_MTTR:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
GEN_LOAD_REG_TN(T0, rt); GEN_LOAD_REG_TN(T0, rt);
gen_mttr(env, ctx, rd, (ctx->opcode >> 5) & 1, gen_mttr(env, ctx, rd, (ctx->opcode >> 5) & 1,
ctx->opcode & 0x7, (ctx->opcode >> 4) & 1); ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
@ -5893,7 +5879,6 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
#if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64) #if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64)
/* MDMX extension to MIPS64 */ /* MDMX extension to MIPS64 */
/* MIPS-3D extension to MIPS64 */
#endif #endif
@ -6133,13 +6118,13 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
GEN_STORE_TN_REG(rt, T0); GEN_STORE_TN_REG(rt, T0);
break; break;
case OPC_FORK: case OPC_FORK:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
GEN_LOAD_REG_TN(T0, rt); GEN_LOAD_REG_TN(T0, rt);
GEN_LOAD_REG_TN(T1, rs); GEN_LOAD_REG_TN(T1, rs);
gen_op_fork(); gen_op_fork();
break; break;
case OPC_YIELD: case OPC_YIELD:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
GEN_LOAD_REG_TN(T0, rs); GEN_LOAD_REG_TN(T0, rs);
gen_op_yield(); gen_op_yield();
GEN_STORE_TN_REG(rd, T0); GEN_STORE_TN_REG(rd, T0);
@ -6219,19 +6204,19 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
op2 = MASK_MFMC0(ctx->opcode); op2 = MASK_MFMC0(ctx->opcode);
switch (op2) { switch (op2) {
case OPC_DMT: case OPC_DMT:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dmt(); gen_op_dmt();
break; break;
case OPC_EMT: case OPC_EMT:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_emt(); gen_op_emt();
break; break;
case OPC_DVPE: case OPC_DVPE:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_dvpe(); gen_op_dvpe();
break; break;
case OPC_EVPE: case OPC_EVPE:
check_mips_mt(env, ctx); check_insn(env, ctx, ASE_MT);
gen_op_evpe(); gen_op_evpe();
break; break;
case OPC_DI: case OPC_DI:
@ -6336,7 +6321,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
#endif #endif
case OPC_BC1ANY2: case OPC_BC1ANY2:
case OPC_BC1ANY4: case OPC_BC1ANY4:
check_cp1_3d(env, ctx); check_insn(env, ctx, ASE_MIPS3D);
/* fall through */ /* fall through */
case OPC_BC1: case OPC_BC1:
gen_compute_branch1(env, ctx, MASK_BC1(ctx->opcode), gen_compute_branch1(env, ctx, MASK_BC1(ctx->opcode),

View File

@ -199,7 +199,7 @@ static mips_def_t mips_defs[] =
.CP0_SRSConf4_rw_bitmask = 0x3fffffff, .CP0_SRSConf4_rw_bitmask = 0x3fffffff,
.CP0_SRSConf4 = (0x3fe << CP0SRSC4_SRS15) | .CP0_SRSConf4 = (0x3fe << CP0SRSC4_SRS15) |
(0x3fe << CP0SRSC4_SRS14) | (0x3fe << CP0SRSC4_SRS13), (0x3fe << CP0SRSC4_SRS14) | (0x3fe << CP0SRSC4_SRS13),
.insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP, .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_MT,
}, },
#if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64) #if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64)
{ {