qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] target-mips: Fix some helper functions (VR54xx


From: Stefan Weil
Subject: Re: [Qemu-devel] [PATCH] target-mips: Fix some helper functions (VR54xx multiplication)
Date: Thu, 23 Aug 2012 22:40:01 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20120724 Iceowl/1.0b1 Icedove/3.0.11

Am 04.03.2012 08:21, schrieb Stefan Weil:
Commits b5dc7732e1cc2fb549e48b7b5d664f2c79628e2e and
be24bb4f3007c3e07cbf1934f7e781493d876ab7 optimized the code
and removed the correct setting of t0. Fix this.

gcc-4.7 detected this bug because parameter arg1 was unused
but set in set_HIT0_LO and set_HI_LOT0.

Cc: Aurelien Jarno<address@hidden>
Signed-off-by: Stefan Weil<address@hidden>
---

Is anybody using QEMU with MIPS VR5432 code which uses the
special multiply opcodes? I don't have such code, so I could
not test my patch.

Regards,
Stefan Weil

  target-mips/op_helper.c |   75 ++++++++++++++++++----------------------------
  1 files changed, 29 insertions(+), 46 deletions(-)

diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c
index c51b9cb..8556c17 100644
--- a/target-mips/op_helper.c
+++ b/target-mips/op_helper.c
@@ -199,115 +199,98 @@ static inline void set_HILO (uint64_t HILO)
      env->active_tc.HI[0] = (int32_t)(HILO>>  32);
  }

-static inline void set_HIT0_LO (target_ulong arg1, uint64_t HILO)
+static inline target_ulong set_HIT0_LO(uint64_t HILO)
  {
+    target_ulong tmp;
      env->active_tc.LO[0] = (int32_t)(HILO&  0xFFFFFFFF);
-    arg1 = env->active_tc.HI[0] = (int32_t)(HILO>>  32);
+    tmp = env->active_tc.HI[0] = (int32_t)(HILO>>  32);
+    return tmp;
  }

-static inline void set_HI_LOT0 (target_ulong arg1, uint64_t HILO)
+static inline target_ulong set_HI_LOT0(uint64_t HILO)
  {
-    arg1 = env->active_tc.LO[0] = (int32_t)(HILO&  0xFFFFFFFF);
+    target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO&  0xFFFFFFFF);
      env->active_tc.HI[0] = (int32_t)(HILO>>  32);
+    return tmp;
  }

  /* Multiplication variants of the vr54xx. */
  target_ulong helper_muls (target_ulong arg1, target_ulong arg2)
  {
-    set_HI_LOT0(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
-
-    return arg1;
+    return set_HI_LOT0(0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
  }

  target_ulong helper_mulsu (target_ulong arg1, target_ulong arg2)
  {
-    set_HI_LOT0(arg1, 0 - ((uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2));
-
-    return arg1;
+    return set_HI_LOT0(0 - (uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2);
  }

  target_ulong helper_macc (target_ulong arg1, target_ulong arg2)
  {
-    set_HI_LOT0(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * 
(int64_t)(int32_t)arg2));
-
-    return arg1;
+    return set_HI_LOT0((int64_t)get_HILO() + (int64_t)(int32_t)arg1 *
+                                             (int64_t)(int32_t)arg2);
  }

  target_ulong helper_macchi (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * 
(int64_t)(int32_t)arg2));
-
-    return arg1;
+    return set_HIT0_LO((int64_t)get_HILO() + (int64_t)(int32_t)arg1 *
+                                             (int64_t)(int32_t)arg2);
  }

  target_ulong helper_maccu (target_ulong arg1, target_ulong arg2)
  {
-    set_HI_LOT0(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2));
-
-    return arg1;
+    return set_HI_LOT0((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 *
+                                              (uint64_t)(uint32_t)arg2);
  }

  target_ulong helper_macchiu (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2));
-
-    return arg1;
+    return set_HIT0_LO((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 *
+                                              (uint64_t)(uint32_t)arg2);
  }

  target_ulong helper_msac (target_ulong arg1, target_ulong arg2)
  {
-    set_HI_LOT0(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * 
(int64_t)(int32_t)arg2));
-
-    return arg1;
+    return set_HI_LOT0((int64_t)get_HILO() - (int64_t)(int32_t)arg1 *
+                                             (int64_t)(int32_t)arg2);
  }

  target_ulong helper_msachi (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * 
(int64_t)(int32_t)arg2));
-
-    return arg1;
+    return set_HIT0_LO((int64_t)get_HILO() - (int64_t)(int32_t)arg1 *
+                                             (int64_t)(int32_t)arg2);
  }

  target_ulong helper_msacu (target_ulong arg1, target_ulong arg2)
  {
-    set_HI_LOT0(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2));
-
-    return arg1;
+    return set_HI_LOT0((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 *
+                                              (uint64_t)(uint32_t)arg2);
  }

  target_ulong helper_msachiu (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2));
-
-    return arg1;
+    return set_HIT0_LO((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 *
+                                              (uint64_t)(uint32_t)arg2);
  }

  target_ulong helper_mulhi (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2);
-
-    return arg1;
+    return set_HIT0_LO((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2);
  }

  target_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2);
-
-    return arg1;
+    return set_HIT0_LO((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2);
  }

  target_ulong helper_mulshi (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
-
-    return arg1;
+    return set_HIT0_LO(0 - (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2);
  }

  target_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2)
  {
-    set_HIT0_LO(arg1, 0 - ((uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2));
-
-    return arg1;
+    return set_HIT0_LO(0 - (uint64_t)(uint32_t)arg1 * 
(uint64_t)(uint32_t)arg2);
  }

  #ifdef TARGET_MIPS64

Ping? Maybe this can be included in 1.2.

Regards,
Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]