diff options
author | Evgeniy Stepanov <eugenis@google.com> | 2011-10-10 13:33:20 +0400 |
---|---|---|
committer | Ben Cheng <bccheng@android.com> | 2011-11-10 16:00:32 -0800 |
commit | 5679ae9f0535ef52ba2a8c055562374997f40afa (patch) | |
tree | e96f40b500b51ea9353e3e14f997969750c15c4e | |
parent | b85221e16a87238eb9d89776e19bc5c07d09efee (diff) | |
download | valgrind-ics-mr1-release.tar.gz |
Fix for LLSC implementation on ~VEX_HWCAPS_ARM_NEON.android-sdk-adt_r20android-sdk-adt_r16.0.1android-sdk-4.0.3_r1android-sdk-4.0.3-tools_r1android-cts-verifier-4.0_r1android-cts-verifier-4.0.3_r1android-cts-4.0_r1android-cts-4.0.3_r2android-cts-4.0.3_r1android-4.0.4_r2.1android-4.0.4_r2android-4.0.4_r1.2android-4.0.4_r1.1android-4.0.4_r1android-4.0.4-aah_r1android-4.0.3_r1.1android-4.0.3_r1android-4.0.2_r1tools_r20ics-mr1-releaseics-mr1ics-mr0-releaseics-mr0ics-aah-release
This is a backport of the following patch by Igor Saenko:
https://bugs.kde.org/show_bug.cgi?id=266035#c43
Change-Id: I95e1591568c2a90ae4b49556abca695d1a9ec7a2
-rw-r--r-- | main/VEX/priv/host_arm_isel.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/main/VEX/priv/host_arm_isel.c b/main/VEX/priv/host_arm_isel.c index c8488a229..45c6f37b6 100644 --- a/main/VEX/priv/host_arm_isel.c +++ b/main/VEX/priv/host_arm_isel.c @@ -5835,12 +5835,20 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) return; } else if (ty == Ity_I64) { HReg raddr = iselIntExpr_R(env, stmt->Ist.LLSC.addr); - HReg dstHi, dstLo; addInstr(env, mk_iMOVds_RR(hregARM_R0(), raddr)); addInstr(env, ARMInstr_LdrEX(8 /* 64-bit */)); - lookupIRTemp64(&dstHi, &dstLo, env, res); - addInstr(env, mk_iMOVds_RR(dstHi, hregARM_R2()) ); - addInstr(env, mk_iMOVds_RR(dstLo, hregARM_R3()) ); + if (arm_hwcaps & VEX_HWCAPS_ARM_NEON) { + HReg tmp = lookupIRTemp(env, res); + addInstr(env, ARMInstr_VXferD(True, tmp, hregARM_R2(), + hregARM_R3())); + } else { + HReg dstHi, dstLo; + /* The returned value is in r1:r0. Park it in the + register-pair associated with tmp. */ + lookupIRTemp64( &dstHi, &dstLo, env, res); + addInstr(env, mk_iMOVds_RR(dstHi, hregARM_R2()) ); + addInstr(env, mk_iMOVds_RR(dstLo, hregARM_R3()) ); + } return; } /* else fall thru; is unhandled */ |