@ -894,6 +894,8 @@ enum {
OPC_EVPE = 0x01 | ( 1 < < 5 ) | OPC_MFMC0 ,
OPC_DI = ( 0 < < 5 ) | ( 0x0C < < 11 ) | OPC_MFMC0 ,
OPC_EI = ( 1 < < 5 ) | ( 0x0C < < 11 ) | OPC_MFMC0 ,
OPC_DVP = 0x04 | ( 0 < < 3 ) | ( 1 < < 5 ) | ( 0 < < 11 ) | OPC_MFMC0 ,
OPC_EVP = 0x04 | ( 0 < < 3 ) | ( 0 < < 5 ) | ( 0 < < 11 ) | OPC_MFMC0 ,
} ;
/* Coprocessor 0 (with rs == C0) */
@ -1429,6 +1431,7 @@ typedef struct DisasContext {
bool mvh ;
int CP0_LLAddr_shift ;
bool ps ;
bool vp ;
} DisasContext ;
enum {
@ -4950,6 +4953,11 @@ static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
gen_helper_mfc0_mvpconf1 ( arg , cpu_env ) ;
rn = " MVPConf1 " ;
break ;
case 4 :
CP0_CHECK ( ctx - > vp ) ;
gen_mfc0_load32 ( arg , offsetof ( CPUMIPSState , CP0_VPControl ) ) ;
rn = " VPControl " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -5077,6 +5085,11 @@ static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
}
rn = " EntryLo1 " ;
break ;
case 1 :
CP0_CHECK ( ctx - > vp ) ;
gen_mfc0_load32 ( arg , offsetof ( CPUMIPSState , CP0_GlobalNumber ) ) ;
rn = " GlobalNumber " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -5597,6 +5610,11 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
/* ignored */
rn = " MVPConf1 " ;
break ;
case 4 :
CP0_CHECK ( ctx - > vp ) ;
/* ignored */
rn = " VPControl " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -5699,6 +5717,11 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
gen_helper_mtc0_entrylo1 ( cpu_env , arg ) ;
rn = " EntryLo1 " ;
break ;
case 1 :
CP0_CHECK ( ctx - > vp ) ;
/* ignored */
rn = " GlobalNumber " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -6234,6 +6257,11 @@ static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
gen_helper_mfc0_mvpconf1 ( arg , cpu_env ) ;
rn = " MVPConf1 " ;
break ;
case 4 :
CP0_CHECK ( ctx - > vp ) ;
gen_mfc0_load32 ( arg , offsetof ( CPUMIPSState , CP0_VPControl ) ) ;
rn = " VPControl " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -6335,6 +6363,11 @@ static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
tcg_gen_ld_tl ( arg , cpu_env , offsetof ( CPUMIPSState , CP0_EntryLo1 ) ) ;
rn = " EntryLo1 " ;
break ;
case 1 :
CP0_CHECK ( ctx - > vp ) ;
gen_mfc0_load32 ( arg , offsetof ( CPUMIPSState , CP0_GlobalNumber ) ) ;
rn = " GlobalNumber " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -6841,6 +6874,11 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
/* ignored */
rn = " MVPConf1 " ;
break ;
case 4 :
CP0_CHECK ( ctx - > vp ) ;
/* ignored */
rn = " VPControl " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -6941,6 +6979,11 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
gen_helper_dmtc0_entrylo1 ( cpu_env , arg ) ;
rn = " EntryLo1 " ;
break ;
case 1 :
CP0_CHECK ( ctx - > vp ) ;
/* ignored */
rn = " GlobalNumber " ;
break ;
default :
goto cp0_unimplemented ;
}
@ -19080,6 +19123,20 @@ static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
gen_helper_evpe ( t0 , cpu_env ) ;
gen_store_gpr ( t0 , rt ) ;
break ;
case OPC_DVP :
check_insn ( ctx , ISA_MIPS32R6 ) ;
if ( ctx - > vp ) {
gen_helper_dvp ( t0 , cpu_env ) ;
gen_store_gpr ( t0 , rt ) ;
}
break ;
case OPC_EVP :
check_insn ( ctx , ISA_MIPS32R6 ) ;
if ( ctx - > vp ) {
gen_helper_evp ( t0 , cpu_env ) ;
gen_store_gpr ( t0 , rt ) ;
}
break ;
case OPC_DI :
check_insn ( ctx , ISA_MIPS32R2 ) ;
save_cpu_state ( ctx , 1 ) ;
@ -19611,6 +19668,7 @@ void gen_intermediate_code(CPUMIPSState *env, struct TranslationBlock *tb)
ctx . ulri = ( env - > CP0_Config3 > > CP0C3_ULRI ) & 1 ;
ctx . ps = ( ( env - > active_fpu . fcr0 > > FCR0_PS ) & 1 ) | |
( env - > insn_flags & ( INSN_LOONGSON2E | INSN_LOONGSON2F ) ) ;
ctx . vp = ( env - > CP0_Config5 > > CP0C5_VP ) & 1 ;
restore_cpu_state ( env , & ctx ) ;
# ifdef CONFIG_USER_ONLY
ctx . mem_idx = MIPS_HFLAG_UM ;
@ -19996,6 +20054,7 @@ void cpu_state_reset(CPUMIPSState *env)
env - > CP0_Random = env - > tlb - > nb_tlb - 1 ;
env - > tlb - > tlb_in_use = env - > tlb - > nb_tlb ;
env - > CP0_Wired = 0 ;
env - > CP0_GlobalNumber = ( cs - > cpu_index & 0xFF ) < < CP0GN_VPId ;
env - > CP0_EBase = ( cs - > cpu_index & 0x3FF ) ;
if ( kvm_enabled ( ) ) {
env - > CP0_EBase | = 0x40000000 ;