@ -819,45 +819,12 @@ static bool trans_l_xori(DisasContext *dc, arg_rri *a)
static bool trans_l_mfspr ( DisasContext * dc , arg_l_mfspr * a )
{
check_r0_write ( dc , a - > d ) ;
if ( is_user ( dc ) ) {
gen_illegal_exception ( dc ) ;
} else {
TCGv spr = tcg_temp_new ( ) ;
if ( tb_cflags ( dc - > base . tb ) & CF_USE_ICOUNT ) {
gen_io_start ( ) ;
if ( dc - > delayed_branch ) {
tcg_gen_mov_tl ( cpu_pc , jmp_pc ) ;
tcg_gen_discard_tl ( jmp_pc ) ;
} else {
tcg_gen_movi_tl ( cpu_pc , dc - > base . pc_next + 4 ) ;
}
dc - > base . is_jmp = DISAS_EXIT ;
}
TCGv spr = tcg_temp_new ( ) ;
tcg_gen_ori_tl ( spr , cpu_R ( dc , a - > a ) , a - > k ) ;
gen_helper_mfspr ( cpu_R ( dc , a - > d ) , cpu_env , cpu_R ( dc , a - > d ) , spr ) ;
}
return true ;
}
static bool trans_l_mtspr ( DisasContext * dc , arg_l_mtspr * a )
{
if ( is_user ( dc ) ) {
gen_illegal_exception ( dc ) ;
} else {
TCGv spr ;
check_r0_write ( dc , a - > d ) ;
if ( tb_cflags ( dc - > base . tb ) & CF_USE_ICOUNT ) {
gen_io_start ( ) ;
}
/* For SR, we will need to exit the TB to recognize the new
* exception state . For NPC , in theory this counts as a branch
* ( although the SPR only exists for use by an ICE ) . Save all
* of the cpu state first , allowing it to be overwritten .
*/
if ( tb_cflags ( dc - > base . tb ) & CF_USE_ICOUNT ) {
gen_io_start ( ) ;
if ( dc - > delayed_branch ) {
tcg_gen_mov_tl ( cpu_pc , jmp_pc ) ;
tcg_gen_discard_tl ( jmp_pc ) ;
@ -865,11 +832,36 @@ static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a)
tcg_gen_movi_tl ( cpu_pc , dc - > base . pc_next + 4 ) ;
}
dc - > base . is_jmp = DISAS_EXIT ;
}
tcg_gen_ori_tl ( spr , cpu_R ( dc , a - > a ) , a - > k ) ;
gen_helper_mfspr ( cpu_R ( dc , a - > d ) , cpu_env , cpu_R ( dc , a - > d ) , spr ) ;
return true ;
}
static bool trans_l_mtspr ( DisasContext * dc , arg_l_mtspr * a )
{
TCGv spr = tcg_temp_new ( ) ;
spr = tcg_temp_new ( ) ;
tcg_gen_ori_tl ( spr , cpu_R ( dc , a - > a ) , a - > k ) ;
gen_helper_mtspr ( cpu_env , spr , cpu_R ( dc , a - > b ) ) ;
if ( tb_cflags ( dc - > base . tb ) & CF_USE_ICOUNT ) {
gen_io_start ( ) ;
}
/*
* For SR , we will need to exit the TB to recognize the new
* exception state . For NPC , in theory this counts as a branch
* ( although the SPR only exists for use by an ICE ) . Save all
* of the cpu state first , allowing it to be overwritten .
*/
if ( dc - > delayed_branch ) {
tcg_gen_mov_tl ( cpu_pc , jmp_pc ) ;
tcg_gen_discard_tl ( jmp_pc ) ;
} else {
tcg_gen_movi_tl ( cpu_pc , dc - > base . pc_next + 4 ) ;
}
dc - > base . is_jmp = DISAS_EXIT ;
tcg_gen_ori_tl ( spr , cpu_R ( dc , a - > a ) , a - > k ) ;
gen_helper_mtspr ( cpu_env , spr , cpu_R ( dc , a - > b ) ) ;
return true ;
}