summaryrefslogtreecommitdiffstats
path: root/src/corelib/arch/qatomic_armv5.h
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kde.org>2013-02-14 11:00:59 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-27 11:24:24 +0100
commit323ba46f72eda8c4da84741467683fdda50653a5 (patch)
tree359c36f1825c514826f60296dddeff05ad15e896 /src/corelib/arch/qatomic_armv5.h
parent212ff4f34de927d1efb4845654b74d4bba8d73b7 (diff)
Fix thumb armv5 atomics
Change-Id: Ie9f98e5f5a08908d9d99e04bdc95fd506cc4a51e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
Diffstat (limited to 'src/corelib/arch/qatomic_armv5.h')
-rw-r--r--src/corelib/arch/qatomic_armv5.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h
index 445379a99c..92e2b02e5b 100644
--- a/src/corelib/arch/qatomic_armv5.h
+++ b/src/corelib/arch/qatomic_armv5.h
@@ -163,12 +163,20 @@ __asm T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL
template<> template <typename T> inline
T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW
{
+#if defined(__thumb__)
+ register T originalValue;
+ do {
+ originalValue = _q_value;
+ } while (_q_cmpxchg(originalValue, newValue, &_q_value) != 0);
+ return originalValue;
+#else
T originalValue;
asm volatile("swp %0,%2,[%3]"
: "=&r"(originalValue), "=m" (_q_value)
: "r"(newValue), "r"(&_q_value)
: "cc", "memory");
return originalValue;
+#endif
}
#endif // Q_CC_RVCT