From e04ea3dc1a6997aa0d2eb8b21170b81f9151d37d Mon Sep 17 00:00:00 2001 From: ths Date: Mon, 25 Jun 2007 13:53:11 +0000 Subject: [PATCH] Handle endianness of double floats, by Magnus Damm. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3020 c046a42c-6fe2-441c-8c8c-71466251a162 --- target-sh4/cpu.h | 2 +- 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(); }