do {
__asm__ __volatile__("@ atomic_cmpxchg\n"
"movs %0, #0\n"
"ldrex %1, [%2]\n"
"mov %0, #0\n"
"cmp %1, %3\n"
"teq %1, %3\n"
"it eq\n"
"strexeq %0, %4, [%2]\n"
: "=&r" (res), "=&r" (oldval)
: "r" (ptr), "Ir" (old), "r" (_new)
-