ARMV7 のアーム インライン アセンブリ コードをコンパイルしてアトミックに比較およびスワップしようとしています。基本的には ARM Linux カーネルからコードをコピーしましたが、どういうわけかコンパイルされません。以下のエラーが発生します
エラー: サム条件付き命令は IT ブロック -- にある必要がありますstrexeq r5,r1,[r3]
。以下はコードです
static inline int
dfp_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src)
{
unsigned long oldval, res;
smp_mb();
do {
__asm__ __volatile__("@ dfp_atomic32_cmpset\n"
"ldrex %1, [%3]\n"
"mov %0, #0\n"
"teq %1, %4\n"
"strexeq %0, %5, [%3]\n"
: "=&r" (res), "=&r" (oldval), "+Qo" (*dst)
: "r" (dst), "Ir" (exp), "r" (src)
: "cc");
} while (res);
smp_mb();
return oldval;
}
そのエラーが何を意味するのか分かりますか?