|
From: <sv...@va...> - 2010-08-31 09:18:32
|
Author: sewardj
Date: 2010-08-31 10:18:22 +0100 (Tue, 31 Aug 2010)
New Revision: 2021
Log:
Fix generation of writeback values in Neon VLDn/VSTn instructions.
Modified:
trunk/priv/guest_arm_toIR.c
Modified: trunk/priv/guest_arm_toIR.c
===================================================================
--- trunk/priv/guest_arm_toIR.c 2010-08-29 12:33:02 UTC (rev 2020)
+++ trunk/priv/guest_arm_toIR.c 2010-08-31 09:18:22 UTC (rev 2021)
@@ -7766,7 +7766,6 @@
UInt N, size, i, j;
UInt inc;
UInt regs = 1;
- IRTemp addr;
if (isT) {
vassert(condT != IRTemp_INVALID);
@@ -7779,6 +7778,12 @@
if (INSN(20,20) != 0)
return False;
+ IRTemp initialRn = newTemp(Ity_I32);
+ assign(initialRn, isT ? getIRegT(rN) : getIRegA(rN));
+
+ IRTemp initialRm = newTemp(Ity_I32);
+ assign(initialRm, isT ? getIRegT(rM) : getIRegA(rM));
+
if (A) {
N = B & 3;
if ((B >> 2) < 3) {
@@ -7794,8 +7799,8 @@
default: vassert(0);
}
- addr = newTemp(Ity_I32);
- assign(addr, isT ? getIRegT(rN) : getIRegA(rN));
+ IRTemp addr = newTemp(Ity_I32);
+ assign(addr, mkexpr(initialRn));
// go uncond
if (condT != IRTemp_INVALID)
@@ -7812,7 +7817,7 @@
DIP(", ");
DIP("d%u[%u]", rD + j * inc, i);
}
- DIP("}, [r%u]%s\n", rN, (rM != 15) ? "!" : "");
+ DIP("}, [r%u]%s\n", rN, (rM != 15) ? "!" : "");
} else {
/* VLDn (single element to all lanes) */
UInt r;
@@ -7838,8 +7843,8 @@
mk_skip_over_T32_if_cond_is_false(condT);
// now uncond
- addr = newTemp(Ity_I32);
- assign(addr, isT ? getIRegT(rN) : getIRegA(rN));
+ IRTemp addr = newTemp(Ity_I32);
+ assign(addr, mkexpr(initialRn));
if (N == 0 && INSN(5,5))
regs = 2;
@@ -7909,15 +7914,16 @@
if (rM != 15) {
if (rM == 13) {
IRExpr* e = binop(Iop_Add32,
- mkexpr(addr),
+ mkexpr(initialRn),
mkU32((1 << size) * (N + 1)));
if (isT)
putIRegT(rN, e, IRTemp_INVALID);
else
putIRegA(rN, e, IRTemp_INVALID, Ijk_Boring);
} else {
- IRExpr* e = binop(Iop_Add32, mkexpr(addr),
- isT ? getIRegT(rM) : getIRegA(rM));
+ IRExpr* e = binop(Iop_Add32,
+ mkexpr(initialRn),
+ mkexpr(initialRm));
if (isT)
putIRegT(rN, e, IRTemp_INVALID);
else
@@ -7968,8 +7974,8 @@
mk_skip_over_T32_if_cond_is_false(condT);
// now uncond
- addr = newTemp(Ity_I32);
- assign(addr, isT ? getIRegT(rN) : getIRegA(rN));
+ IRTemp addr = newTemp(Ity_I32);
+ assign(addr, mkexpr(initialRn));
for (r = 0; r < regs; r++) {
for (i = 0; i < elems; i++) {
@@ -7987,15 +7993,16 @@
if (rM != 15) {
if (rM == 13) {
IRExpr* e = binop(Iop_Add32,
- mkexpr(addr),
+ mkexpr(initialRn),
mkU32(8 * (N + 1) * regs));
if (isT)
putIRegT(rN, e, IRTemp_INVALID);
else
putIRegA(rN, e, IRTemp_INVALID, Ijk_Boring);
} else {
- IRExpr* e = binop(Iop_Add32, mkexpr(addr),
- isT ? getIRegT(rM) : getIRegA(rM));
+ IRExpr* e = binop(Iop_Add32,
+ mkexpr(initialRn),
+ mkexpr(initialRm));
if (isT)
putIRegT(rN, e, IRTemp_INVALID);
else
|