qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [6808] tcg-arm: fix qemu_ld64


From: Aurelien Jarno
Subject: [Qemu-devel] [6808] tcg-arm: fix qemu_ld64
Date: Tue, 10 Mar 2009 21:43:25 +0000

Revision: 6808
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6808
Author:   aurel32
Date:     2009-03-10 21:43:25 +0000 (Tue, 10 Mar 2009)
Log Message:
-----------
tcg-arm: fix qemu_ld64

Emulating fldl on arm doesn't seem to work too well. It's the way
qemu_ld64 is translated to arm instructions.

        tcg_out_ld32_12(s, COND_AL, data_reg, addr_reg, 0);
        tcg_out_ld32_12(s, COND_AL, data_reg2, addr_reg, 4);

Consider case where data_reg==0, data_reg2==1, and addr_reg==0. First load
overwrited addr_reg. So let's put an if (data_ref==addr_reg).

(Pablo Virolainen)

Modified Paths:
--------------
    trunk/tcg/arm/tcg-target.c

Modified: trunk/tcg/arm/tcg-target.c
===================================================================
--- trunk/tcg/arm/tcg-target.c  2009-03-10 19:37:56 UTC (rev 6807)
+++ trunk/tcg/arm/tcg-target.c  2009-03-10 21:43:25 UTC (rev 6808)
@@ -1011,8 +1011,13 @@
     case 3:
         /* TODO: use block load -
          * check that data_reg2 > data_reg or the other way */
-        tcg_out_ld32_12(s, COND_AL, data_reg, addr_reg, 0);
-        tcg_out_ld32_12(s, COND_AL, data_reg2, addr_reg, 4);
+        if (data_reg == addr_reg) {
+            tcg_out_ld32_12(s, COND_AL, data_reg2, addr_reg, 4);
+            tcg_out_ld32_12(s, COND_AL, data_reg, addr_reg, 0);
+        } else {
+            tcg_out_ld32_12(s, COND_AL, data_reg, addr_reg, 0);
+            tcg_out_ld32_12(s, COND_AL, data_reg2, addr_reg, 4);
+        }
         break;
     }
 #endif





reply via email to

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