diff options
-rw-r--r-- | target-sh4/cpu.h | 2 | ||||
-rw-r--r-- | target-sh4/op.c | 24 |
2 files changed, 19 insertions, 7 deletions
diff --git a/target-sh4/cpu.h b/target-sh4/cpu.h index 5290dd2642..9fc0edae29 100644 --- a/target-sh4/cpu.h +++ b/target-sh4/cpu.h @@ -80,7 +80,7 @@ typedef struct tlb_t { typedef struct CPUSH4State { uint32_t flags; /* general execution flags */ uint32_t gregs[24]; /* general registers */ - uint32_t fregs[32]; /* floating point registers */ + float32 fregs[32]; /* floating point registers */ uint32_t sr; /* status register */ uint32_t ssr; /* saved status register */ uint32_t spc; /* saved program counter */ diff --git a/target-sh4/op.c b/target-sh4/op.c index f45c2f4677..34e271524e 100644 --- a/target-sh4/op.c +++ b/target-sh4/op.c @@ -698,37 +698,49 @@ void OPPROTO op_movl_imm_rN(void) void OPPROTO op_fmov_frN_FT0(void) { - FT0 = *(float32 *)&env->fregs[PARAM1]; + FT0 = env->fregs[PARAM1]; RETURN(); } void OPPROTO op_fmov_drN_DT0(void) { - DT0 = *(float64 *)&env->fregs[PARAM1]; + CPU_DoubleU d; + + d.l.upper = *(uint32_t *)&env->fregs[PARAM1]; + d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1]; + DT0 = d.d; RETURN(); } void OPPROTO op_fmov_frN_FT1(void) { - FT1 = *(float32 *)&env->fregs[PARAM1]; + FT1 = env->fregs[PARAM1]; RETURN(); } void OPPROTO op_fmov_drN_DT1(void) { - DT1 = *(float64 *)&env->fregs[PARAM1]; + CPU_DoubleU d; + + d.l.upper = *(uint32_t *)&env->fregs[PARAM1]; + d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1]; + DT1 = d.d; RETURN(); } void OPPROTO op_fmov_FT0_frN(void) { - *(float32 *)&env->fregs[PARAM1] = FT0; + env->fregs[PARAM1] = FT0; RETURN(); } void OPPROTO op_fmov_DT0_drN(void) { - *(float64 *)&env->fregs[PARAM1] = DT0; + CPU_DoubleU d; + + d.d = DT0; + *(uint32_t *)&env->fregs[PARAM1] = d.l.upper; + *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower; RETURN(); } |