From: Julian Seward Date: Sat, 15 Mar 2014 08:33:06 +0000 (+0000) Subject: LDRD/STRD reg+/-#imm8: allow PC as the base register in the X-Git-Tag: svn/VALGRIND_3_10_1^2~131 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f8f4a59d508b27f22ab6ecddf7e406343455cd4;p=thirdparty%2Fvalgrind.git LDRD/STRD reg+/-#imm8: allow PC as the base register in the case "ldrd Rt, Rt2, [PC, #+/-imm8]". n-i-bz. git-svn-id: svn://svn.valgrind.org/vex/trunk@2839 --- diff --git a/VEX/priv/guest_arm_toIR.c b/VEX/priv/guest_arm_toIR.c index 86fa03975d..fe5e6d2e9c 100644 --- a/VEX/priv/guest_arm_toIR.c +++ b/VEX/priv/guest_arm_toIR.c @@ -20401,7 +20401,7 @@ DisResult disInstr_THUMB_WRK ( /* -------------- LDRD/STRD reg+/-#imm8 -------------- */ /* Doubleword loads and stores of the form: - ldrd/strd Rt, Rt2, [Rn, #-imm8] or + ldrd/strd Rt, Rt2, [Rn, #+/-imm8] or ldrd/strd Rt, Rt2, [Rn], #+/-imm8 or ldrd/strd Rt, Rt2, [Rn, #+/-imm8]! */ @@ -20419,8 +20419,11 @@ DisResult disInstr_THUMB_WRK ( if (bP == 0 && bW == 0) valid = False; if (bW == 1 && (rN == rT || rN == rT2)) valid = False; if (isBadRegT(rT) || isBadRegT(rT2)) valid = False; - if (rN == 15) valid = False; if (bL == 1 && rT == rT2) valid = False; + /* It's OK to use PC as the base register only in the + following case: ldrd Rt, Rt2, [PC, #+/-imm8] */ + if (rN == 15 && (bL == 0/*store*/ + || bW == 1/*wb*/)) valid = False; if (valid) { IRTemp preAddr = newTemp(Ity_I32);