UInt N, size, i, j;
UInt inc;
UInt regs = 1;
- IRTemp addr;
if (isT) {
vassert(condT != IRTemp_INVALID);
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) {
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)
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;
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;
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
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++) {
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