Handle endianness of double floats, by Magnus Damm.
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 25 Jun 2007 13:53:11 +0000 (13:53 +0000)
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 25 Jun 2007 13:53:11 +0000 (13:53 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3020 c046a42c-6fe2-441c-8c8c-71466251a162

target-sh4/cpu.h
target-sh4/op.c

index 5290dd2..9fc0eda 100644 (file)
@@ -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 */
index f45c2f4..34e2715 100644 (file)
@@ -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();
 }