Revision 08fa4bab target-mips/op.c
b/target-mips/op.c | ||
---|---|---|
1841 | 1841 |
|
1842 | 1842 |
val = T0 & mask; |
1843 | 1843 |
old = env->CP0_Status; |
1844 |
if (!(val & (1 << CP0St_EXL)) && |
|
1845 |
!(val & (1 << CP0St_ERL)) && |
|
1846 |
!(env->hflags & MIPS_HFLAG_DM) && |
|
1847 |
(val & (1 << CP0St_UM))) |
|
1848 |
env->hflags |= MIPS_HFLAG_UM; |
|
1849 |
#ifdef TARGET_MIPS64 |
|
1850 |
if ((env->hflags & MIPS_HFLAG_UM) && |
|
1851 |
!(val & (1 << CP0St_PX)) && |
|
1852 |
!(val & (1 << CP0St_UX))) |
|
1853 |
env->hflags &= ~MIPS_HFLAG_64; |
|
1854 |
#endif |
|
1855 |
if ((val & (1 << CP0St_CU0)) || !(env->hflags & MIPS_HFLAG_UM)) |
|
1856 |
env->hflags |= MIPS_HFLAG_CP0; |
|
1857 |
else |
|
1858 |
env->hflags &= ~MIPS_HFLAG_CP0; |
|
1859 |
if (val & (1 << CP0St_CU1)) |
|
1860 |
env->hflags |= MIPS_HFLAG_FPU; |
|
1861 |
else |
|
1862 |
env->hflags &= ~MIPS_HFLAG_FPU; |
|
1863 |
if (val & (1 << CP0St_FR)) |
|
1864 |
env->hflags |= MIPS_HFLAG_F64; |
|
1865 |
else |
|
1866 |
env->hflags &= ~MIPS_HFLAG_F64; |
|
1867 | 1844 |
env->CP0_Status = (env->CP0_Status & ~mask) | val; |
1845 |
CALL_FROM_TB1(compute_hflags, env); |
|
1868 | 1846 |
if (loglevel & CPU_LOG_EXEC) |
1869 | 1847 |
CALL_FROM_TB2(do_mtc0_status_debug, old, val); |
1870 | 1848 |
CALL_FROM_TB1(cpu_mips_update_irq, env); |
... | ... | |
3009 | 2987 |
env->PC[env->current_tc] = env->CP0_EPC; |
3010 | 2988 |
env->CP0_Status &= ~(1 << CP0St_EXL); |
3011 | 2989 |
} |
3012 |
if (!(env->CP0_Status & (1 << CP0St_EXL)) && |
|
3013 |
!(env->CP0_Status & (1 << CP0St_ERL)) && |
|
3014 |
!(env->hflags & MIPS_HFLAG_DM) && |
|
3015 |
(env->CP0_Status & (1 << CP0St_UM))) |
|
3016 |
env->hflags |= MIPS_HFLAG_UM; |
|
3017 |
#ifdef TARGET_MIPS64 |
|
3018 |
if ((env->hflags & MIPS_HFLAG_UM) && |
|
3019 |
!(env->CP0_Status & (1 << CP0St_PX)) && |
|
3020 |
!(env->CP0_Status & (1 << CP0St_UX))) |
|
3021 |
env->hflags &= ~MIPS_HFLAG_64; |
|
3022 |
#endif |
|
3023 |
if ((env->CP0_Status & (1 << CP0St_CU0)) || !(env->hflags & MIPS_HFLAG_UM)) |
|
3024 |
env->hflags |= MIPS_HFLAG_CP0; |
|
3025 |
else |
|
3026 |
env->hflags &= ~MIPS_HFLAG_CP0; |
|
2990 |
CALL_FROM_TB1(compute_hflags, env); |
|
3027 | 2991 |
if (loglevel & CPU_LOG_EXEC) |
3028 | 2992 |
CALL_FROM_TB0(debug_post_eret); |
3029 | 2993 |
env->CP0_LLAddr = 1; |
... | ... | |
3035 | 2999 |
if (loglevel & CPU_LOG_EXEC) |
3036 | 3000 |
CALL_FROM_TB0(debug_pre_eret); |
3037 | 3001 |
env->PC[env->current_tc] = env->CP0_DEPC; |
3038 |
env->hflags |= MIPS_HFLAG_DM; |
|
3039 |
if (!(env->CP0_Status & (1 << CP0St_EXL)) && |
|
3040 |
!(env->CP0_Status & (1 << CP0St_ERL)) && |
|
3041 |
!(env->hflags & MIPS_HFLAG_DM) && |
|
3042 |
(env->CP0_Status & (1 << CP0St_UM))) |
|
3043 |
env->hflags |= MIPS_HFLAG_UM; |
|
3044 |
#ifdef TARGET_MIPS64 |
|
3045 |
if ((env->hflags & MIPS_HFLAG_UM) && |
|
3046 |
!(env->CP0_Status & (1 << CP0St_PX)) && |
|
3047 |
!(env->CP0_Status & (1 << CP0St_UX))) |
|
3048 |
env->hflags &= ~MIPS_HFLAG_64; |
|
3049 |
#endif |
|
3050 |
if ((env->CP0_Status & (1 << CP0St_CU0)) || !(env->hflags & MIPS_HFLAG_UM)) |
|
3051 |
env->hflags |= MIPS_HFLAG_CP0; |
|
3052 |
else |
|
3053 |
env->hflags &= ~MIPS_HFLAG_CP0; |
|
3002 |
env->hflags &= MIPS_HFLAG_DM; |
|
3003 |
CALL_FROM_TB1(compute_hflags, env); |
|
3054 | 3004 |
if (loglevel & CPU_LOG_EXEC) |
3055 | 3005 |
CALL_FROM_TB0(debug_post_eret); |
3056 | 3006 |
env->CP0_LLAddr = 1; |
Also available in: Unified diff