aboutsummaryrefslogtreecommitdiff
path: root/target-mips/exec.h
diff options
context:
space:
mode:
Diffstat (limited to 'target-mips/exec.h')
-rw-r--r--target-mips/exec.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/target-mips/exec.h b/target-mips/exec.h
index 9ff3f08b59..b6300bd494 100644
--- a/target-mips/exec.h
+++ b/target-mips/exec.h
@@ -261,16 +261,21 @@ static inline void compute_hflags(CPUState *env)
MIPS_HFLAG_FPU | MIPS_HFLAG_UM);
if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
!(env->CP0_Status & (1 << CP0St_ERL)) &&
- !(env->hflags & MIPS_HFLAG_DM) &&
- (env->CP0_Status & (1 << CP0St_UM)))
- env->hflags |= MIPS_HFLAG_UM;
+ !(env->hflags & MIPS_HFLAG_DM)) {
+ if (env->CP0_Status & (1 << CP0St_UM))
+ env->hflags |= MIPS_HFLAG_UM;
+ if (env->CP0_Status & (1 << CP0St_R0))
+ env->hflags |= MIPS_HFLAG_SM;
+ }
#ifdef TARGET_MIPS64
if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_Status & (1 << CP0St_PX)) ||
(env->CP0_Status & (1 << CP0St_UX)))
env->hflags |= MIPS_HFLAG_64;
#endif
- if ((env->CP0_Status & (1 << CP0St_CU0)) || !(env->hflags & MIPS_HFLAG_UM))
+ if ((env->CP0_Status & (1 << CP0St_CU0)) ||
+ (!(env->hflags & MIPS_HFLAG_UM) &&
+ !(env->hflags & MIPS_HFLAG_SM)))
env->hflags |= MIPS_HFLAG_CP0;
if (env->CP0_Status & (1 << CP0St_CU1))
env->hflags |= MIPS_HFLAG_FPU;