【发布时间】:2015-01-22 18:20:08
【问题描述】:
下面的代码是android上比较和交换的ARM实现:
__ATOMIC_INLINE__ int __bionic_cmpxchg(int32_t old_value, int32_t new_value, volatile int32_t* ptr) {
int32_t prev, status;
do {
__asm__ __volatile__ (
"ldrex %0, [%3]\n"
"mov %1, #0\n"
"teq %0, %4\n"
#ifdef __thumb2__
"it eq\n"
#endif
"strexeq %1, %5, [%3]"
: "=&r" (prev), "=&r" (status), "+m"(*ptr)
: "r" (ptr), "Ir" (old_value), "r" (new_value)
: "cc");
} while (__builtin_expect(status != 0, 0));
return prev != old_value;
}
即使条件不相等,strexeq 是否会清除 ldrex 中设置的监视器,如果不相等,这如何安全?
还有,为什么我们需要额外的 it eq 用于 thumb2?
【问题讨论】:
-
16 位 thumb/thumb2 指令没有像 32 位 ARM 指令那样用于谓词执行的编码空间,因此您需要
it eq来使 thumb2 指令成为有条件的。
标签: android c assembly arm atomic