[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [6808] tcg-arm: fix qemu_ld64,
Aurelien Jarno <=