static void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)

{

    const char *opn = "ldst";



    switch (opc) {

    case OPC_MFC0:

        if (rt == 0) {

            /* Treat as NOP */

            return;

        }

        gen_mfc0(ctx, rd, ctx->opcode & 0x7);

        gen_op_store_T0_gpr(rt);

        opn = "mfc0";

        break;

    case OPC_MTC0:

        GEN_LOAD_REG_TN(T0, rt);

        gen_mtc0(ctx, rd, ctx->opcode & 0x7);

        opn = "mtc0";

        break;

#ifdef TARGET_MIPS64

    case OPC_DMFC0:

        if (rt == 0) {

            /* Treat as NOP */

            return;

        }

        gen_dmfc0(ctx, rd, ctx->opcode & 0x7);

        gen_op_store_T0_gpr(rt);

        opn = "dmfc0";

        break;

    case OPC_DMTC0:

        GEN_LOAD_REG_TN(T0, rt);

        gen_dmtc0(ctx, rd, ctx->opcode & 0x7);

        opn = "dmtc0";

        break;

#endif

    case OPC_TLBWI:

        opn = "tlbwi";

        if (!env->do_tlbwi)

            goto die;

        gen_op_tlbwi();

        break;

    case OPC_TLBWR:

        opn = "tlbwr";

        if (!env->do_tlbwr)

            goto die;

        gen_op_tlbwr();

        break;

    case OPC_TLBP:

        opn = "tlbp";

        if (!env->do_tlbp)

            goto die;

        gen_op_tlbp();

        break;

    case OPC_TLBR:

        opn = "tlbr";

        if (!env->do_tlbr)

            goto die;

        gen_op_tlbr();

        break;

    case OPC_ERET:

        opn = "eret";

        save_cpu_state(ctx, 0);

        gen_op_eret();

        ctx->bstate = BS_EXCP;

        break;

    case OPC_DERET:

        opn = "deret";

        if (!(ctx->hflags & MIPS_HFLAG_DM)) {

            MIPS_INVAL(opn);

            generate_exception(ctx, EXCP_RI);

        } else {

            save_cpu_state(ctx, 0);

            gen_op_deret();

            ctx->bstate = BS_EXCP;

        }

        break;

    case OPC_WAIT:

        opn = "wait";

        /* If we get an exception, we want to restart at next instruction */

        ctx->pc += 4;

        save_cpu_state(ctx, 1);

        ctx->pc -= 4;

        gen_op_wait();

        ctx->bstate = BS_EXCP;

        break;

    default:

 die:

        MIPS_INVAL(opn);

        generate_exception(ctx, EXCP_RI);

        return;

    }

    MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);

}

static void gen_cp0 (CPUState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)

{

    const char *opn = "ldst";



    switch (opc) {

    case OPC_MFC0:

        if (rt == 0) {

            

            return;

        }

        gen_mfc0(ctx, rd, ctx->opcode & 0x7);

        gen_op_store_T0_gpr(rt);

        opn = "mfc0";

        break;

    case OPC_MTC0:

        GEN_LOAD_REG_TN(T0, rt);

        gen_mtc0(ctx, rd, ctx->opcode & 0x7);

        opn = "mtc0";

        break;

#ifdef TARGET_MIPS64

    case OPC_DMFC0:

        if (rt == 0) {

            

            return;

        }

        gen_dmfc0(ctx, rd, ctx->opcode & 0x7);

        gen_op_store_T0_gpr(rt);

        opn = "dmfc0";

        break;

    case OPC_DMTC0:

        GEN_LOAD_REG_TN(T0, rt);

        gen_dmtc0(ctx, rd, ctx->opcode & 0x7);

        opn = "dmtc0";

        break;

#endif

    case OPC_TLBWI:

        opn = "tlbwi";

        if (!env->do_tlbwi)

            goto die;

        gen_op_tlbwi();

        break;

    case OPC_TLBWR:

        opn = "tlbwr";

        if (!env->do_tlbwr)

            goto die;

        gen_op_tlbwr();

        break;

    case OPC_TLBP:

        opn = "tlbp";

        if (!env->do_tlbp)

            goto die;

        gen_op_tlbp();

        break;

    case OPC_TLBR:

        opn = "tlbr";

        if (!env->do_tlbr)

            goto die;

        gen_op_tlbr();

        break;

    case OPC_ERET:

        opn = "eret";

        save_cpu_state(ctx, 0);

        gen_op_eret();

        ctx->bstate = BS_EXCP;

        break;

    case OPC_DERET:

        opn = "deret";

        if (!(ctx->hflags & MIPS_HFLAG_DM)) {

            MIPS_INVAL(opn);

            generate_exception(ctx, EXCP_RI);

        } else {

            save_cpu_state(ctx, 0);

            gen_op_deret();

            ctx->bstate = BS_EXCP;

        }

        break;

    case OPC_WAIT:

        opn = "wait";

        

        ctx->pc += 4;

        save_cpu_state(ctx, 1);

        ctx->pc -= 4;

        gen_op_wait();

        ctx->bstate = BS_EXCP;

        break;

    default:

 die:

        MIPS_INVAL(opn);

        generate_exception(ctx, EXCP_RI);

        return;

    }

    MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);

}

static void FUNC_0 (CPUState *VAR_0, DisasContext *VAR_1, uint32_t VAR_2, int VAR_3, int VAR_4)

{

    const char *VAR_5 = "ldst";



    switch (VAR_2) {

    case OPC_MFC0:

        if (VAR_3 == 0) {

            

            return;

        }

        gen_mfc0(VAR_1, VAR_4, VAR_1->opcode & 0x7);

        gen_op_store_T0_gpr(VAR_3);

        VAR_5 = "mfc0";

        break;

    case OPC_MTC0:

        GEN_LOAD_REG_TN(T0, VAR_3);

        gen_mtc0(VAR_1, VAR_4, VAR_1->opcode & 0x7);

        VAR_5 = "mtc0";

        break;

#ifdef TARGET_MIPS64

    case OPC_DMFC0:

        if (VAR_3 == 0) {

            

            return;

        }

        gen_dmfc0(VAR_1, VAR_4, VAR_1->opcode & 0x7);

        gen_op_store_T0_gpr(VAR_3);

        VAR_5 = "dmfc0";

        break;

    case OPC_DMTC0:

        GEN_LOAD_REG_TN(T0, VAR_3);

        gen_dmtc0(VAR_1, VAR_4, VAR_1->opcode & 0x7);

        VAR_5 = "dmtc0";

        break;

#endif

    case OPC_TLBWI:

        VAR_5 = "tlbwi";

        if (!VAR_0->do_tlbwi)

            goto die;

        gen_op_tlbwi();

        break;

    case OPC_TLBWR:

        VAR_5 = "tlbwr";

        if (!VAR_0->do_tlbwr)

            goto die;

        gen_op_tlbwr();

        break;

    case OPC_TLBP:

        VAR_5 = "tlbp";

        if (!VAR_0->do_tlbp)

            goto die;

        gen_op_tlbp();

        break;

    case OPC_TLBR:

        VAR_5 = "tlbr";

        if (!VAR_0->do_tlbr)

            goto die;

        gen_op_tlbr();

        break;

    case OPC_ERET:

        VAR_5 = "eret";

        save_cpu_state(VAR_1, 0);

        gen_op_eret();

        VAR_1->bstate = BS_EXCP;

        break;

    case OPC_DERET:

        VAR_5 = "deret";

        if (!(VAR_1->hflags & MIPS_HFLAG_DM)) {

            MIPS_INVAL(VAR_5);

            generate_exception(VAR_1, EXCP_RI);

        } else {

            save_cpu_state(VAR_1, 0);

            gen_op_deret();

            VAR_1->bstate = BS_EXCP;

        }

        break;

    case OPC_WAIT:

        VAR_5 = "wait";

        

        VAR_1->pc += 4;

        save_cpu_state(VAR_1, 1);

        VAR_1->pc -= 4;

        gen_op_wait();

        VAR_1->bstate = BS_EXCP;

        break;

    default:

 die:

        MIPS_INVAL(VAR_5);

        generate_exception(VAR_1, EXCP_RI);

        return;

    }

    MIPS_DEBUG("%s %s %d", VAR_5, regnames[VAR_3], VAR_4);

}

static void FUNC_0 (CPUState *VAR_0, DisasContext *VAR_1, uint32_t VAR_2, int VAR_3, int VAR_4)
{ const char *VAR_5 = "ldst"; switch (VAR_2) { case OPC_MFC0:
if (VAR_3 == 0) { return; } gen_mfc0(VAR_1, VAR_4, VAR_1->opcode & 0x7); gen_op_store_T0_gpr(VAR_3); VAR_5 = "mfc0"; break; case OPC_MTC0:
GEN_LOAD_REG_TN(T0, VAR_3); gen_mtc0(VAR_1, VAR_4, VAR_1->opcode & 0x7); VAR_5 = "mtc0"; break; #ifdef TARGET_MIPS64
case OPC_DMFC0:
if (VAR_3 == 0) { return; } gen_dmfc0(VAR_1, VAR_4, VAR_1->opcode & 0x7); gen_op_store_T0_gpr(VAR_3); VAR_5 = "dmfc0"; break; case OPC_DMTC0:
GEN_LOAD_REG_TN(T0, VAR_3); gen_dmtc0(VAR_1, VAR_4, VAR_1->opcode & 0x7); VAR_5 = "dmtc0"; break; #endif
case OPC_TLBWI:
VAR_5 = "tlbwi"; if (!VAR_0->do_tlbwi)
goto die; gen_op_tlbwi(); break; case OPC_TLBWR:
VAR_5 = "tlbwr"; if (!VAR_0->do_tlbwr)
goto die; gen_op_tlbwr(); break; case OPC_TLBP:
VAR_5 = "tlbp"; if (!VAR_0->do_tlbp)
goto die; gen_op_tlbp(); break; case OPC_TLBR:
VAR_5 = "tlbr"; if (!VAR_0->do_tlbr)
goto die; gen_op_tlbr(); break; case OPC_ERET:
VAR_5 = "eret"; save_cpu_state(VAR_1, 0); gen_op_eret(); VAR_1->bstate = BS_EXCP; break; case OPC_DERET:
VAR_5 = "deret"; if (!(VAR_1->hflags & MIPS_HFLAG_DM)) { MIPS_INVAL(VAR_5); generate_exception(VAR_1, EXCP_RI); } else { save_cpu_state(VAR_1, 0); gen_op_deret(); VAR_1->bstate = BS_EXCP; } break; case OPC_WAIT:
VAR_5 = "wait"; VAR_1->pc += 4; save_cpu_state(VAR_1, 1); VAR_1->pc -= 4; gen_op_wait(); VAR_1->bstate = BS_EXCP; break; default:
die:
MIPS_INVAL(VAR_5); generate_exception(VAR_1, EXCP_RI); return; } MIPS_DEBUG("%s %s %d", VAR_5, regnames[VAR_3], VAR_4); }